Pythonでテキストの抽出をしてみる提出番号編-CSVファイルの作成まで
前回までで提出日の取得とテキストの書き込みができました。今回は最後の「提出番号」と「通知番号」を取り出してみたいと思います。
複数行にまたがっている
複数行にまたがっているのと、今までは提出人 数字 など一行になっていたのが、二行になっています。
「提出番号 PYT」ではなく、下にきています。これは今までと違って困りました。
複数行にマッチするre.DOTALLを使う?
複数行にマッチする方法でre.DOTALLというのがありますが、これを使えばいいのかなと思いました
結論:いらない
いりませんでした。なのでre.DOTALLの使い方はわからないのと、もしかしたらfindallでは使えない?のかもしれません。
二つともだす
正規表現を使う場合は法則を見つけて抽出すると聞いたことがあります。しかし今の時点で法則性はわかりません。例えばPYTで始まるというならいいですが変わるかもしれません。
※その時プログラムを作り直す必要があります
クライアントによってはできれば作り直さなくてもつかえるようにと言われる場合もあります。
クライアントと相談して落としどころを見つけるしかありません。今回はPYTは固定ですが、通知番号の「通知」はある場合とない場合があるかもしれません。
まずは二つとも出してみます。
#提出番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
コードを書きます。提出番号というワードに、空白をいれて全角、半角の英字がある場合は表示するという風にします。実行すると
提出番号 通知番号
PYT/MQL4827/793784 通知256488
このファイルは適当に作ったサンプルファイルとなります。
Python
となります。「このファイルは~」からはいりません。できれば提出番号と通知番号だけを抽出したいです。というわけでコードを少し変えます。
通知番号は半角数字
通知番号の数字は今回は半角の数字となります。
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z 0-9 0-9]", str_areas)
単純に半角数字と全角数字を取り出すように、いれてみました。実行してみます
提出番号 通知番号
PYT/MQL4827/793784 通知256488
このファイルは適当に作ったサンプルファイルとなります。
Python
変わりません。
考え方
「提出番号」スペース「通知番号」となっていて、次の行に「PYT」と「通知」があります。そこでコードは
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]", str_areas)
提出番号の後に空白があり、一つ以上続いたら半角と全角の英数を取得としています。しかしこれでは余分な個所を取得します。
通知番号は半角の数字ですが、提出番号は全角数字を使っています。
コードに、全角と半角の数字を取得するようにします。
#提出番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]+[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
+で半角数字をとるようにもしました。実行します。
提出番号 通知番号
PYT/MQL4
おしい・・・
不思議なことに、「+」を「*」にするとうまくいきます。*は0回以上の違いなのですがなぜかうまくいきました。
#提出番号+通知番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
このコードを実行すると
提出番号 通知番号
PYT/MQL4827/793784 通知256488
取得はうまくいきます。ただこのままではよくないです。
文字列連結をする
コードのコメントアウト(print)を外して書き込みをコメントアウトして実行します
#提出番号+通知番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
result = result.split()
print(result)
#f.write(result + '\n')
このように。実行すると
整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日 昭和16年 2月 29日
['提出番号', '通知番号', 'PYT/MQL4827/793784', '通知256488']
となります。文字列が「4つ」になりました。Pythonでは「0」から数えるため、提出番号=0、通知番号=1、PYT=2、通知25~=3となります。
文字列連結をする
提出人と参考人をやったときみたいに、文字列連結をします。
#提出番号+通知番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
result = result.split()
print(result[0]+result[2])
print(result[1]+result[3])
#f.write(result + '\n')
実行すると
整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日 昭和16年 2月 29日
提出番号PYT/MQL4827/793784
通知番号通知256488
無事に必要な情報がとりだせました。あとは書き込みをします。
#提出番号+通知番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
result = result.split()
print(result[0]+result[2])
print(result[1]+result[3])
f.write(result[0]+result[2] + '\n')
f.write(result[1]+result[3] + '\n')
実行すると書き込みをします。sample_python_txtが色々書きこまれていてわからないという場合は、一度削除してみてください。その後実行すればよいです
このように書き込まれていると思います。
ここまでのコード
ここまでのコードを書きます。
import os
import re
#ファイルの読み込み
path = '1pdf.txt'
#ファイルを開く
with open(path) as open_file:
areas = open_file.read()
#str型に変換
str_areas = str(areas)
#print(str_areas)
results = re.findall(r"整理番号:\d*", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
#令和の日付
results = re.findall(r"日付:[明治|大正|昭和|平成|令和]+\d+年\d月\d+日", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
#平成を取得
results = re.findall(r"[明治|大正|昭和|平成|令和]+[\s]+[0-9]+年[0-9]月+[\s]+[0-9]+日", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
#提出人と参考人を取得
results = re.findall(r"提出人[\s\S]+[0-9]+", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
result = result.split()
print(result[0]+result[1])
print(result[2]+result[3]+result[4])
f.write(result[0]+result[1] + '\n')
f.write(result[2]+result[3]+result[4] + '\n')
#提出日を取得
results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
#result = result.split()
print(result)
f.write(result + '\n')
#提出番号+通知番号
results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
with open("sample_python_txt.txt",'a',newline='') as f:
for result in results:
result = result.split()
print(result[0]+result[2])
print(result[1]+result[3])
f.write(result[0]+result[2] + '\n')
f.write(result[1]+result[3] + '\n')
とても長いコードです。可読性とか効率を考えると悪いコードかもしれませんが、まずはできることを優先にしております。今後勉強しながらもっと良いコードかけるようになっていければと思っております。
お役に立ちましたか?
投げ銭をいただけるともっと頑張れます!
・note
・仮想通貨(bitflyer)
・キャッシュ
のどれでも構いません
ビットコインアドレスは以下になります
3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS