インターネット上には関連する情報がたくさんありますが、どれもまとまっていません。そこで、私は分類を作成しました。自分自身が見やすいだけでなく、この記事を見る他の人も手間を省くことができます。
ヒント:正規表現のパターン引数には通常バックスラッシュが含まれていますが、エスケープ文字として認識されるのを防ぐために、r''
という生の文字列を使用することが最善です(例:r'\t'
は\\t
と等価です)。対応する特殊文字をマッチさせるために、生の文字列を使用すると、バックスラッシュを少なく書くことができ、コードの読みやすさも向上します。
正規表現の 4 つの主な機能:マッチング(真偽値)、取得、置換、分割。
単一の文字のマッチング#
- . :任意の 1 文字を表します。例えば、パターン
't.o'
はtoo
またはtwo
に一致します。 - [...]:[] 内に列挙されたすべての文字の中から1 つをマッチさせます。
- 1 つの [] は 1 文字を表します:
[amk]
は 'a'、'm'、または 'k' に一致します。[a-zA-Z0-9]
はすべての英字と数字を表します。[A-Z][a-z]
は最初の文字が大文字で、2 番目の文字が小文字であることを表します。 - 内容を
,
で区切る必要はないことに注意してください。[0-35-9]
は 0〜3 と 5〜9 を表します。 -
を使用して範囲を指定できます。例えば、[abc]
と[a-c]
は同じ意味です。
- 1 つの [] は 1 文字を表します:
- [^...]:[] 内に含まれない文字の中から1 つをマッチさせます。
[^abc]
は 'a'、'b'、'c' 以外の文字に一致します。
単一の文字のマッチング - 文字セット [] 内に書くこともできます#
- \w:数字、英字、アンダースコアに一致します。
[a-zA-Z0-9_]
と等価で、Unicode 文字では漢字や全角数字にも一致します。 - \W:数字、英字、アンダースコア以外に一致します。
[^A-Za-z0-9_]
と等価です。 - \s:任意の空白文字、スペース、タブに一致します。
[\t\n\r\f]
と等価です。 - \S:任意の非空白文字に一致します。
[^\t\n\r\f]
と等価です。 - \d:任意の数字に一致します。
[0-9]
と等価です。 - \D:任意の数字以外に一致します。
[^0-9]
と等価です。
複数の文字のマッチング#
- *:直前の文字が 0 回以上繰り返されるパターンに一致します。例えば、パターン
abc*
はab
、abccc
に一致します。 - +:直前の文字が 1 回以上繰り返されるパターンに一致します。例えば、パターン
abc+
はabc
、abccc
に一致します。 - ?:直前の文字が 1 回または 0 回繰り返されるパターンに一致します。非貪欲。
- {m}:直前の文字が m 回繰り返されるパターンに一致します。例えば、パターン
ab{2}c
はabbc
に一致します。 - {m,}:直前のパターンが少なくとも m 回繰り返されるパターンに一致します。
- {,n}:直前のパターンが最大で n 回繰り返されるパターンに一致します。
- {m,n}:直前の文字が少なくとも m 回、最大で n 回繰り返されるパターンに一致します。例えば、パターン
ab{1,3}c
はabc
、abbc
、abbbc
に一致します。
特殊なマッチング#
- | :左右のいずれかのパターンに一致します。例えば、0 から 100 の数字に一致するパターンは
re.match(r'[1-9]?\d$|100',string)
です。 - ():括弧内のパターンに一致します。グループ(全体)を表すこともできます。
|
と組み合わせて使用することもできます。例えば、メールアドレスを認識する場合は(163|126|qq)
です。 - \b:単語の境界に一致します。
\b
は幅ゼロで文字を占有しないため、境界線の存在です。\b
の左右のいずれかには\w
があり、もう一方には\W
がある必要があります。- つまり、境界にある文字に一致するために使用されます。例えば、
\bhe
は "he" に一致しますが、"where" には一致しません。 \bman\b
は "I am a man, not a woman" の中のman
に一致しますが、woman
には一致しません。しかし、man\b
はman
とwoman
に一致します。後者の "man" も境界にあるため、使用する際には注意が必要です。
- \B:単語の境界以外に一致します。
\b
とは逆で、次のように理解できます:\B
の左右のいずれかには\w
がすべてあるか、\W
がすべてあるかです。- 例えば、
py=\B
は "py==" の中の "py=" に一致しますが、"py=1" の中の "py=" には一致しません。
- \n,\t,など:改行に一致します、タブに一致します、など。
位置のクラス#
- ^:文字列の先頭に一致します。
- $:文字列の末尾に一致します。
- 例:
re.match(r'[\w]{4,20}@163\.com$','[email protected]')
- グループと組み合わせて使用できます。
- 例:
- \A:文字列の先頭に一致します。
- \Z:文字列の末尾に一致します。改行が存在する場合は、改行の前までの終了文字列に一致します。
- \z:文字列の末尾に一致します。
- \G:最後にマッチした位置に一致します。
例#
- [Pp] ython: "Python" または "python" に一致します。
- rub [ye]: "ruby" または "rube" に一致します。
- [aeiou]:[] 内の任意の文字に一致します。
- [0-9]:任意の数字に一致します。[0123456789] と同様です。
- [a-z]:任意の小文字に一致します。
- [A-Z]:任意の大文字に一致します。
- [a-zA-Z0-9]:任意の英字と数字に一致します。
- [^aeiou]:aeiou 以外のすべての文字に一致します。
- [^0-9]:数字以外のすべての文字に一致します。
*:アスタリスク。直前の文字が 0 回以上繰り返されるパターンに一致します。例えば、'pytho\*n'
は pythn、pythoon、pythooooon などに一致します。?、+、または {m,n} など、他の繰り返し文字にも一致するものがあります。{n,m} は柔軟に使用でき、n 回から m 回までの繰り返しを表します。
\b の使用法も柔軟で、与えられた文字列内で小文字で始まる単語を見つけます。
ss = "i Am a gOod boy baby!!"
result=re.findall(r'\b[a-z][a-zA-Z]*\b',ss)
print(result)