Pythonでテキストの抽出をしてみる日付編-CSVファイルの作成まで
前回の続きで今回もテキストの抽出をしていきます。
抽出するテキスト
・整理番号
・日付(令和の箇所)
・日付(平成の箇所)
・提出人
・参考人
・提出日
・提出番号
・通知番号
で1つ前では整理番号を取り出しました。今回は残りの日付〜提出日までをやっていきます。
※やり方は前回と同じになります。
※もっとスマートな書き方とか効率のよい書き方があるかもしれませんが、自分にはこれが限界でした。効率良くできたりスマートな書き方ある場合は教えていただけると嬉しいです
日付
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')
日付(令和の箇所)を抽出しました。グループ化(明治|大正|昭和|平成|令和)だとその後のテキストがとれないため、集合にしております。実際に実行してみると
整理番号:322636940
日付:令和2年4月15日
と日付までしゅとくできます。
グループ化の場合は
整理番号:322636940
令和
となります。取得できるのが和暦の元号だけとなります。集合にすることで日付全てをもってこれましたので集合としています。
[明治|大正|昭和|平成|令和]
#明治~令和までのどれかがマッチすると抽出するということになります。orと同じになります。
\d+年\d月\d+日
#日付を取得しています。\dは[0-9]と同じ意味になります。日付だけ15日と二桁なので\dが2つあります。年号も二桁の場合があるのでd+としています
日付(平成)
令和の日付は取得できたので今度は平成の日付を取得してみます。書き方は同じでもいけそうなのでそのままコピーしてみます。
#平成を取得
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')
実際に実行してみます。
整理番号:322636940
日付:令和2年4月15日
令和2年4月15日
あれ?平成ではなく令和が2つきました。何故平成をとらないのでしょう?
よーく見ると全角・・・
PDFやテキストデータを見ると、30年が全角文字になっています。そして平成の間にもスペースがあります。コードを書き直してみます。平成の後にスペース(全角1つ? or 半角2つ?)があります。どっちかわからない場合もあるので以下のようにします
results = re.findall(r"[明治|大正|昭和|平成|令和]+[\s\S]", 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')
[\s\S]と置き換えました。←の意味はhttps://docs.python.org/ja/3/howto/regex.htmlに載っております。
\s:任意の空白文字とマッチします; これは集合 [ \t\n\r\f\v] と同じ意味です。
\S:任意の非空白文字とマッチします; これは集合 [^ \t\n\r\f\v] と同じ意味です。
半角スペースなら\sでいいですが、全角スペースだとマッチしません。そこで\Sを使う事で全角スペースにもマッチさせています。この状態で実際に実行してみると
整理番号:322636940
日付:令和2年4月15日
令和2
平成
大葉
昭和1
となります。最早謎です。これは平成の後の数値をとってないため、全角スペースが1つ以上続く場合がマッチしていると思います。今回は平成の日付をマッチさせたいので見ていきます。
全角数字になっている
見ると、平成の箇所は全て全角の数字となっております。\dは[0-9]と同義ですが、これは半角数字をさしてます。全角数字だとマッチしません。
全角数字でマッチさせる
全角数字でマッチするには、[0-9]と全角数字にすることで可能になります。コードを5月2日まで書いてみたいと思います。
#平成を取得
results = re.findall(r"[明治|大正|昭和|平成|令和]+[\s\S]+[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')
実行すると・・・・
整理番号:322636940
日付:令和2年4月15日
あれ?平成が全部消えてしまいました。マッチしてないみたいです。テキストを見てみると・・・5月 2と妙な空白があります。半角スペースがもしかしたらあるかもしれません。
コードを追記してみます。
#平成を取得
results = re.findall(r"[明治|大正|昭和|平成|令和]+[\s\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')
これを実行してみます
整理番号:322636940
日付:令和2年4月15日
令和2年4月15日
番号通知
平成 30年5月 2日
取得はできましたが、思ったより違います。番号通知という要らないテキストが入ってしまいました。そして日付も取得できているけど右より・・・
コードは合っている?と思いますがマッチのしかたが変みたいです。
実は全角スペースではない・・?
テキストを見ると全角スペースなので合っていると思いますが、このままでは困りました。方法としては文字列毎に分けて結合とかあるかもしれませんが、少しコードを変えてみます。
最終的にしたコード
#平成を取得
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')
全角スペースなどを取得する\Sをとりました。これで実行すると
整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
ちゃんと令和と平成の取得ができました。
ここまでのコード
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')
今回はここまでにして、次回提出人などをやってみたいと思います。
お役に立ちましたか?
投げ銭をいただけるともっと頑張れます!
・note
・仮想通貨(bitflyer)
・キャッシュ
のどれでも構いません
ビットコインアドレスは以下になります
3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS