インターネット上には関連する情報がたくさんありますが、どれもまとまっていません。そこで、私は分類を作成しました。自分自身が見やすくなるだけでなく、この記事を見る人も手間を省くことができます。
ヒント:正規表現のパターン引数には通常バックスラッシュが含まれていますが、エスケープ文字として認識されるのを防ぐために、原始文字列 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 つをマッチさせます。[^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の両方に一致しますので注意が必要です。
- \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)