はじめに
正規表現で . + * {...} (...)
をよく使うが、?
の使い道がわからず調べてみた。特に文字列の最短ヒットをさせるときに使と便利。
目次
「X?」直前にXがあるorない。
例えば「。」がついても、ついてなくてもヒットさせたい場合は下記の通り。
"!"で終わる場合"!"を含まないようにヒットする。
example.py
str_data = 'あついですね'
hit_data = re.search(r'.*ですね。?',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 6), match='あついですね'>
str_data = 'あついですね。'
hit_data = re.search(r'.*ですね。?',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 7), match='あついですね。'>
str_data = 'あついですね!'
hit_data = re.search(r'.*ですね。?',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 6), match='あついですね'>
「(?=XXXX)」後ろにXXXと続く。
例えば後ろに"さん"か"様"がつくものをヒットさせる。
example.py
str_data = 'たろう様'
hit_data = re.search(r'.+(?=(さん|様)$)',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 3), match='たろう'>
str_data = 'たろうさん'
hit_data = re.search(r'.+(?=(さん|様)$)',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 3), match='たろう'>
str_data = 'たろうくん'
hit_data = re.search(r'.+(?=(さん|様)$)',str_data)
print(f'# {hit_data}')
# None
str_data = 'たろう'
hit_data = re.search(r'.+(?=(さん|様)$)',str_data)
print(f'# {hit_data}')
# None
最短でヒットさせる。
同じ文字列が並んでいるときに最短でヒットさせたい場合に使う。
例は直後に,
がある文字列を最短ヒットさせる。
example.py
str_data = '012,345,678,'
hit_data = re.search(r'.*,',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 12), match='012,345,678,'>
# 最長でヒットする。
hit_data = re.search(r'.*?,',str_data)
print(f'# {hit_data}')
# <re.Match object; span=(0, 4), match='012,'>
# 最短でヒットする。
以上