アンカー (パターンの位置)
パターンの位置を指定するメタ文字 を アンカー とよびます。
正規表現では文字列の先頭と末尾を表すアンカーが定められています。
文字列の先頭
^ は文字列の先頭を表すアンカーです。
たとえば、^今日 というパターンは
・今日は良い天気ですね。
・今日の試合は絶対に勝つぞ!
・今日がダメでも、明日があるさ。
のような文字列にマッチします。
# PYTHON_REGEX_ANCHOR
# In[1]
import re
# 正規表現オブジェクトを作成
regex = re.compile(r'^今日')
# 検索対象となる文字列を作成
sentence_1 = "今日はとても良い天気だ。"
# 検索対象となる文字列を作成
sentence_2 = "よし。今日こそメタクラスの記事を書こう。"
# sentence_1を検索
f1 = regex.search(sentence_1)
# sentence_1を検索
f2 = regex.search(sentence_2)
print(f1)
print(f2)
# <_sre.SRE_Match object; span=(0, 2), match='今日'>
# None
$ は文字列の末尾を表すアンカーです。
たとえば、なさい。$ は
・早く寝なさい。
・朝ですよ。もう起きなさい。
・いい加減にしなさい。
のような文字列にマッチします。
# In[2]
regex = re.compile(r'なさい。$')
# 検索対象となる文字列を作成
sentence_1 = "早く寝なさい。"
# 検索対象となる文字列を作成
sentence_2 = "いい加減にしなさい!"
# sentence_1を検索して適合した文字列をリストで取得
f1 = regex.findall(sentence_1)
# sentence_2を検索して適合した文字列をリストで取得
f2 = regex.findall(sentence_2)
print(f1)
print(f2)
# ['なさい。']
# []
MULTILINE の設定
re.complie() のフラグに re.M または re.MULTILINE を指定すると、^ は行頭、$ は行末に対して適用されるようになります。コード中の文字列であれば、エスケープシーケンス \n で区切られた文章ごとに適合チェックが行なわれることになります。
# In[3]
# 正規表現オブジェクトを作成(マルチラインを設定)
regex = re.compile(r'^明日', re.M)
# 検索対象となる文字列を作成
sentence = "今日は普段より早く寝ることにした。\n\
明日の試験に備えて十分な睡眠をとる必要がある。\n\
そう思ってベッドに入ったものの、試験のことを考えると不安になって眠れない。"
# sentenceを検索して適合した文字列をリストで取得
f = regex.findall(sentence)
print(f)
# ['明日']
このコードでは2行目の頭にある "明日" が検索にかかっています。
文字列をアンカーで囲む
文字列を ^ と $ で囲むこともできます。たとえば ^ごめんなさい。$ というパターンは
・ごめんなさい。
という文字列だけにマッチします。
# In[4]
# 正規表現オブジェクトを作成(マルチラインを設定)
regex = re.compile(r'^明日もPython$', re.M)
# 検索対象となる文字列を作成
sentence = "今日もPython\n\
明日もPython\n\
こうして毎日頑張ることで、Pythonグランドマスターへの道が開けるのである。"
# sentenceを検索
s = regex.search(sentence)
print(s)
# <_sre.SRE_Match object; span=(10, 19), match='明日もPython'>
下記は誤植と思われますので、ご確認ください。
「文字列の先頭」の説明文で、$ は行末を → $ は文字列の末尾を
ありがとうございます。
直しておきました。