【Python3】正規表現における文字型変数の使用方法
こんにちわ、ぶらじるです。
Python3で正規表現中に文字型変数を使用したかったのですが、使用方法が分からず、少しハマったので技術的な備忘録として記載しておきます。
※資産運用関連の記事ばかりになっているため、今回は箸休めだと思って、生暖かい目で見守ってください。笑
正規表現
Python3でも正規表現が使用できます。
正規表現自体の説明については、大勢のプログラマーの方々がPython3の正規表現に関する記事を作成していますので、各自ググって確認してください。
やりたいこと
今回、ぶらじるは、与えられた文書において、任意の2つの文字列を検索フラグ(タグ)として使用し、その間(beginとend)に囲まれた文字列を抽出する、ということを実現したかったのです。(日本語が不自由かよ...)
こういうこと↓
与えられた文書
Lorem ipsum {dolor} sit amet, consectetur adipiscing elit,
検索フラグ
"{" と "}" が検索フラグになる。
ただし、与えられる文書によっては、 "[" と "]" になることや ">" と "<" になることもあり、文書ごとに変化する。
以降では、この部分をそれぞれ begin と end と表現する。
その間(beginとend)に囲まれた文字列
dolor
従い、この例題の場合、検索結果で"dolor" (beginとend間に囲まれた文字)が出てくればOKということになります。
reモジュールとcompile関数
reモジュールとcompile関数を用いて処理速度を高めると共に、繰り返し使用する場合にも備えます。
ひとまず、簡単ですが下記の様に表現できます。
code
import re
line = "Lorem ipsum {dolor} sit amet, consectetur adipiscing elit,"
begin = "{"
end = "}"
pattern = re.compile(begin)
s = pattern.findall(line)
print(s)
実行結果
# {
実行結果としては、この部分しか出てこない...これは意図しない結果です。
この表現だと終わりの位置が不明なので、beginとendに囲まれた文字列を抽出する、ことができません。
例えば、 "{" (begin)で引っ掛けて、その後、 "}" (end)でも引っ掛けて...と2段階で検索フラグを使用しても問題ないのですが、これだと、なんだかイケてません。。。
解決方法
そこで、いろいろ調べた結果、ぶらじるはformat関数を用いて解決しました。
下記の様にcompile関数内にformat関数を用いて表現した検索フラグを埋め込みます。
pattern = re.compile(r"\{0}(.*?)\{1}".format(begin, end))
※beginとendには "{}" や "[]" が動的に入ってくる。当然、検索フラグを直接指定しても問題ない。
この様な表現をすれば、beginとendに囲まれた文字列を一発で検索&抽出することが可能になります。
{0}とbegin、{1}とendが変数に対応する形になっています。{2}, {3}...と多数の検索フラグを設定することも可能です。
結果
import re
line = "Lorem ipsum {dolor} sit amet, consectetur adipiscing elit,"
begin = "{"
end = "}"
pattern = re.compile(r"\{0}(.*?)\{1}".format(begin, end))
s = pattern.findall(line)
print(s)
# dolor
無事にbeginとendに囲まれた文字列を抽出することができました。
参考
- note.nkmk.meさんの「正規表現モジュールreの使い方」
https://note.nkmk.me/python-re-match-search-findall-etc/ - @luohao0404さんの「分かりやすいpythonの正規表現の例」
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3
以上です。