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