Python で文章の中から正規表現を使って特定のキーワードから改行までの文字を簡単に抽出できるようになります。
Web ページからのスクレイピングなら Beautiful SOAP などを使って CSS selector を使いながら特定の文字を探すことができます。
しかし、メールの本文や一定のルールはあるけど、要素やクラスが存在せず、Beautiful SOAPが使いづらい時は正規表現が有効です。
Pythonで正規表現を使ってみよう!
試しにテキストを作成して抽出してみましょう。今回はこんなテキストを用意してみました。
text = ''' 名前:山田太郎 メールアドレス: test@gmail.com ID:123 '''
この中から名前、アドレス、IDを取得してみましょう。これだけならsplit()やfor、if を使って取り出せなくはないですが、結構複雑な処理になりそうです。複雑になるとバグが入る可能性も否めません。
正規表現を使って特定のキーワードから始まる文字を抽出する関数を作ってみました。
import re
def find_text_start_from(keyword,text):
search = keyword +".+"
result = re.search(search, text)
if result == None:
return None
else:
return result.group(0).replace(keyword,"").strip()
関数の解説
この関数はキーワードとテキストを引数にとって「キーワードから改行まで」を取得します。
上の文章で言うと名前:山田太郎
の「山田太郎」だけが抽出されます。
search = keyword +".+"
この部分が正規表現の元となる部分です。
keyword から始まる.
任意の文字 +
1回以上繰り返し(改行まで)を search にまとめています。
取得したテキストにはキーワードの文字が含まれるのでその文字をreplaceで置き換えます。
余計な空白が文字列の前後に入っているとエラーの原因になるので.strip()で取り除きます。
result.group(0).replace(keyword,"").strip()
↓ここで
search = keyword +".+"
keyword
を上書きせずにsearchという変数を使ったのはそのためです。
ifで条件分岐をして、ヒットしなかった時はNoneを返します。
return None
実践
この関数を使って名前、アドレス、IDを抽出します。コード全体はこんな感じです。実行してみましょう。
import re
def find_text_start_from(keyword,text):
search = keyword +".+"
result = re.search(search, text)
if result == None:
return None
else:
return result.group(0).replace(keyword,"")
if __name__ == '__main__':
text = '''
名前:山田太郎
メールアドレス: test@gmail.com
ID:123
'''
name = find_text_start_from("名前:",text)
email = find_text_start_from("メールアドレス:",text)
id = find_text_start_from("ID:",text)
print(name)
print(email)
print(id)
実行結果はこの通り。
山田太郎
test@gmail.com
123
とても簡単に目的のテキストを抽出できました。
メールアドレス: test@gmail.com
アドレスの前の余計な空白がstrip()によって取り除かれているも確認できます。
まとめ
今回は正規表現と言ってもそれらしいものは.+
の2つしか使っていませんが、それでもこの便利さです。
もっと色んな正規表現の方法を覚えることで複雑な文字列の抽出ができるようになります。
正規表現を使うとテキストの抽出が格段に簡単になるのでぜひ皆さんも試してみてくださいね^^
※ 上記のコードは Google Colabにコピペして簡単に実行できます。
コメントを残す