Pythonでテキストの抽出をしてみる提出編-CSVファイルの作成まで

×前回までで、整理番号~日付まで取得しました。今回は提出人などをやってみたいと思います。

提出人

コードをコピーしてまずは提出人の箇所を取得してみたいと思います。

#提出人を取得
 results = re.findall(r"提出人", 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日
提出人

となります。ここまでは問題なさそうです。提出人はテキストファイルの読み込みについて2で載せていますのでそのままコードを使えます。

#提出人を取得
 results = re.findall(r"提出人[\s\S]+[0-9]{10,}", 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')

{10,}と範囲をつけました。これは10桁以上としております。サンプルでは12桁となりますが、もしかしたら12桁より増える可能性もある場合は桁数を指定してやってみました。絶対に固定ということであれば桁数を指定で良いと思います。

桁数の指定がしやすい例

桁数の指定がしやすいといえば郵便番号になると思います。○○○-××××と7桁と決まっています。
携帯電話も0x0-1234-5678と3-4-4と桁数が決まっています。このように桁数が決まっている場合は桁数を指定すると良いみたいです。
参考サイト:正規表現:数字の桁数、数字の範囲を指定する表現

コードを実行してみます

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人   544506015206

無事に取得できました。

参考人を取得

参考人を取得してみようと思います。文字列でやればそのまま「青しそ 大葉」等で取得すればいいのですが、ここは毎回同じとは限りません。変わる可能性もあります。このままでは取得できません。提出人のコードを少し変えてみて、そこから取得できないか試してみます。

#提出人を取得
 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)
         #f.write(result + '\n')

提出人のコードの桁数を消して、1回以上続くという+にしてみました。実行すると・・・

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
['提出人', '544506015206', '参考人', '青しそ', '大葉', '様', '提出日', '昭和16年', '2月', '29日', '提出番号', '通知番号', 'PYT/MQL4827/793784']

となります。文字列が取得できます。提出人と番号が区切られているので、まずは提出人を取得してみます。

  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])
         #f.write(result + '\n')

実行してみると

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206

提出人が取得できました。同じように参考人をしてみたいと思います。

課題点

サンプルでは、「青しそ」と「大葉」の間にスペースがあり、文字列としては別としてなっています。もしこれがスペースなどないと1つの文字列として扱われる可能性があります。現時点ではスペースありで文字列がわかれているということでやっていきます。何か良い方法あるという方はご教示いただけると幸いです。

#提出人を取得
 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 + '\n')

コードを実行すると

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉

無事に取得できました。

テキストに書き込む

コードでは、まだテキストファイルに書き込みをしておりません。あくまでprint関数で出力しただけになります。

テキストに書き込みたいと思います。そのまま連結でいけるっぽいのでやってみたいと思います。

#提出人を取得
 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]+[明治|大正|昭和|平成|令和]", 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年」が全角の「16」になっています。「2月」は半角と全角と半角が入り交じっています。
おそらく書類を作成する人が慣れていなくて全角と半角をいれてしまったのかもしれません。本来であれば気をつけていただきたいのですが人の手でやるとなるとこのようになることも想定しなくてはいけません。そして16年の後に「空白」もあります。
if文などで空白ある場合とない場合などでできればいいのですが残念ながら僕にはその技術がございません。
何か良い方法あるという方はご教示いただけると幸いです。

#提出日を取得
 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')

いきなりコードですが、書いてみました。[0-9 0-9]と半角と全角のどっちの数字が入っていても取得できるように個別に書いています。これで取得できます。

ここまでのコード

ここまでのコードを書いておきます。

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')

お役に立ちましたか?

投げ銭をいただけるともっと頑張れます!
・note
・仮想通貨(bitflyer)
キャッシュ
のどれでも構いません
ビットコインアドレスは以下になります
3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS

この記事が気に入ったらサポートをしてみませんか?