正規表現

Python では,ある文字列が別の文字列に含まれているかどうかを調べるには in を使うことができます。例えば "げほ" in "ほげほげ" の値は True になります。

このような文字列照合をさらに拡張した仕組みが正規表現(regular expression)です。

よく使うコマンド grep も正規表現で文字列を検索するツールです。grep の語源は諸説ありますが,真ん中の re は regular expression を意味しています。

Python で正規表現を扱うためには,標準ライブラリ re日本語ドキュメント)またはサードパーティのライブラリ regex を使います。以下では re を使います。

次の例での正規表現は "げほ" という単純な文字列です。

import re

if re.search("げほ", "ほげほげ"):
    print("「げほ」は「ほげほげ」に含まれます")
else:
    print("「げほ」は「ほげほげ」に含まれません")

m = re.search("げほ", "ほげほげ")
m.span()  # 一致位置を表すtuple (1, 3)

先頭は ^,末尾は $,任意の1文字は .,任意の0文字以上は .* で表します。括弧はグルーピングを意味します。

正規表現 ^ほげ(.*)$ は,先頭に「ほげ」があるパターンを表します。「ほげ」以下の末尾までは括弧で囲んでありますので一つのグループです。

m = re.search("^ほげ(.*)$", "ほげふが")
m     # 一致しなければ偽
m[0]  # 一致全体「ほげふが」
m[1]  # 1番目のグループ「ふが」

m = re.search("^ほげ(.*)へ(.*)$", "ほげふがへろへろ")
m[0]  # 一致全体「ほげふがへろへろ」
m[1]  # 1番目のグループ「ふがへろ」
m[2]  # 2番目のグループ「ろ」

.* はできるだけ長い任意の文字列にマッチします。.*? はできるだけ短い任意の文字列にマッチします。

m = re.search("^ほげ(.*?)へ(.*)$", "ほげふがへろへろ")
m[0]  # 一致全体「ほげふがへろへろ」
m[1]  # 1番目のグループ「ふが」
m[2]  # 2番目のグループ「ろへろ」

0から9までの数字(半角)は [0-9]、0から9までの数字(全角)は [0-9] で表します。任意の数字(半角・全角)は \d で表します。直前の正規表現の1個以上の連なりは + を付けて表します。

re.search("[0-9]+", "two22二")[0]    # '2'
re.search("[0-9]+", "two22二")[0]  # '2'
re.search("\d+", "two22二")[0]       # '22'

Last modified: