ネット上の関連資料は非常に多いですが、乱雑です。そこで、分類を作成しました。一つは自分が見やすくするため、もう一つはこの記事を読む方々の手間を省くためです。
ヒント:正規表現の pattern パラメータには通常バックスラッシュが含まれています。これらがエスケープ文字として認識されないように、原始文字列 r'' を使用して表すのが最善です。(例 r'\t'は \\t と等価です)対応する特殊文字にマッチします。
原始文字列を使用する利点は、\を少なく書け、コードの読みやすさが向上することです。
正規表現の四大機能:マッチ(bool 値)、取得、置換、分割。
単一文字のマッチ#
- . :任意の一文字を表します。例えば、式
't.o'では、tooまたは'two'が条件に合致します。 - [...]:[] 内に列挙されたすべての文字の一つにマッチします。
- 一つの [] は一文字を表します:
[amk]は 'a'、'm'、または 'k' にマッチします。[a-zA-Z0-9]はすべてのアルファベットと数字を表します。[A-Z][a-z]は最初の文字が大文字、二番目の文字が小文字であることを示します。 - 内容を
,で分割する必要はありません。[0-35-9]は 0~3 と 5~9 を表します。 -を使って範囲を指定できます。例えば、[abc]と[a-c]は同じ意味です。
- 一つの [] は一文字を表します:
- [^...]:[] に含まれない文字の一つにマッチします。
[^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 回出現することにマッチします。つまり、1 回あるか、ないかです。非貪欲。
- {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 から n 回出現することにマッチします。例えば、'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)