Intro to Python
正規表現
最終更新:
introtopython
目次
文字列が指定の正規表現パターンとマッチするか否か調べる
reモジュールのsearch関数を使う。指定した正規表現パターンとマッチするとMatchオブジェクトを返し、マッチしないとNoneを返す。戻り値はブール型ではとそれぞれTrueとFalseになるので、そのままブール式として利用できる。
>>> import re
>>> s = '和多田美咲さん'
>>> print(re.search('美咲さん$', s))
<re.Match object; span=(3, 7), match='美咲さん'>
>>> print(re.search('^和', s))
<re.Match object; span=(0, 1), match='和'>
>>> print(re.search('和$', s))
None
>>> bool(re.search('美咲さん$', s))
True
>>> bool(re.search('和$', s))
False
複数を一度に調べたいときは、リストにしてリスト内包表記を使う。
>>> ss = ['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', '和多田美咲']
>>> [s for s in ss if re.search('美', s)]
['瀬戸麻沙美', '和多田美咲']
>>> [s for s in ss if re.search('美$', s)]
['瀬戸麻沙美']
>>> [s for s in ss if re.search('希世乃', s)]
[]
>>> len([s for s in ss if re.search('美', s)])
2
>>> len([s for s in ss if re.search('希世乃', s)])
0
特定の文字列で始まる(始まらない)文字列を抽出する
正規表現で^記号は文字列の先頭を表すため、これを正規表現パターンに利用する。以下の例では、複数の文字列からなるリストから、リスト内包表記を使用して、指定した正規表現パターンにマッチする(しない)要素を取り出している。
>>> import re
>>> ss = ['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', 'のぐちゆり', '和多田美咲']
>>> # 「美」で終わる氏名
>>> [s for s in ss if re.search('美$', s)]
['瀬戸麻沙美']
>>> # 「美」で終わらない氏名
>>> [s for s in ss if not re.search('美$', s)]
['石見舞菜香', '鈴木みのり', 'のぐちゆり', '和多田美咲']
>>> # 「美」を含むが「美」で終わらない氏名
>>> [s for s in ss if re.search('美.+$', s)]
['和多田美咲']
ルックアラウンド式(lookaround expression)を使うこともできる。
>>> # 「美」で終わる氏名 ※肯定的な後読み
>>> [s for s in ss if re.search('(?<=美)$', s)]
['瀬戸麻沙美']
>>> # 「美」で終わらない氏名 ※否定的な後読み
>>> [s for s in ss if re.search('(?<!美)$', s)]
['石見舞菜香', '鈴木みのり', 'のぐちゆり', '和多田美咲']
ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。
特定の文字列で終わる(終わらない)文字列を抽出する
正規表現で$記号は文字列の最後を表すため、これを正規表現パターンに利用する。以下の例では、複数の文字列からなるリストから、リスト内包表記を使用して、指定した正規表現パターンにマッチする(しない)要素を取り出している。
>>> import re
>>> ss = ['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', 'のぐちゆり', '和多田美咲']
>>> # 「の」で始まる氏名
>>> [s for s in ss if re.search('^の', s)]
['のぐちゆり']
>>> # 「の」で始まらない氏名
>>> [s for s in ss if not re.search('^の', s)]
['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', '和多田美咲']
>>> # 「の」を含むが「の」で始まらない氏名
>>> [s for s in ss if re.search('^.+の', s)]
['鈴木みのり']
ルックアラウンド式(lookaround expression)を使うこともできる。
>>> # 「の」で始まる氏名 ※肯定的な先読み
>>> [s for s in ss if re.search('^(?=の)', s)]
['のぐちゆり']
>>> # 「の」で始まらない氏名 ※否定的な先読み
>>> [s for s in ss if re.search('^(?!の)', s)]
['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', '和多田美咲']
ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。