ぶらじる’s備忘録集

お仕事での技術的な事柄の備忘録集です。資産運用に関する投稿もしていきます。

【Python3】正規表現における文字型変数の使用方法

こんにちわ、ぶらじるです。

 

f:id:Brazil_No11:20190611142106p:plain

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に囲まれた文字列を抽出することができました。

 

参考

  1. note.nkmk.meさんの「正規表現モジュールreの使い方」
    https://note.nkmk.me/python-re-match-search-findall-etc/
  2. @luohao0404さんの「分かりやすいpython正規表現の例」
    https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3

 

以上です。