Python正規表現における文字セット
文字クラス\dと\wはあまり柔軟ではありません。数字以外のすべての文字を見つけるといった簡単なタスクでさえ、これらでは解決できません。そのようなタスクには、'または'を表す角括弧を使用するべきです。
角括弧は、その中にリストされた任意の1文字に置き換わります。例えば、x[abc]xは、両端に文字xがあり、その間に'a'、'b'、または'c'のいずれか1文字があることを意味します。
角括弧の後には繰り返し演算子を書くことができます。例えば、x[abc]+xは、xの間に'a'、'b'、'c'の文字が任意の組み合わせで任意の数だけ存在できることを意味します。
文字を列挙するだけでなく、ハイフンで区切られた2つの文字の間の範囲を指定して文字グループを作成することもできます。例えば、[a-d]は、'a'から'd'までのすべての文字を表します。
例を見てみましょう。
例
この例では、検索パターンは次のようになります:xの間に'a'から'z'までの任意の文字:
コード実行結果:
'! ! ! x@x'
例
この例では、検索パターンは次のようになります:xの間に'a'から'k'までの任意の文字:
txt = 'xax xbx xmx x@x'
res = re.sub('x[a-k]x', '!', txt)
print(res)
コード実行結果:
'! ! xmx x@x'
例
この例では、検索パターンは次のようになります:xの間に'A'から'Z'までの任意の文字:
txt = 'xax xBx xcx x@x'
res = re.sub('x[A-Z]x', '!', txt)
print(res)
コード実行結果:
'xax ! xcx x@x'
例
この例では、検索パターンは次のようになります:xの間に0から9までの任意の数字:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[0-9]x', '!', txt)
print(res)
コード実行結果:
'xax ! ! ! x@x'
例
この例では、検索パターンは次のようになります:xの間に3から7までの任意の数字:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[3-7]x', '!', txt)
print(res)
コード実行結果:
'xax x1x ! ! x@x'
例
この例では、検索パターンは次のようになります:xの間に'a'から'z'までの任意の文字、または1から9までの任意の数字:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[a-z1-9]x', '!', txt)
print(res)
コード実行結果:
'! ! ! ! x@x'
例
この例では、検索パターンは次のようになります:xの間に'a'から'z'、または'A'から'Z'までの任意の文字:
txt = 'xax xBx xcx x5x x@x'
res = re.sub('x[a-zA-Z]x', '!', txt)
print(res)
コード実行結果:
'! ! ! x5x x@x'
例
この例では、検索パターンは次のようになります:xの間に'a'から'z'までの任意の文字、または数字1、2:
txt = 'xax xbx x1x x2x x3x'
res = re.sub('x[a-z12]x', '!', txt)
print(res)
コード実行結果:
'! ! ! ! x3x'
例
この例では、検索パターンは次のようになります:xの間に'a'から'z'までの文字が1回以上繰り返される:
txt = 'xx xabesx xaadx x123x xa3x'
res = re.sub('x[a-z]+x', '!', txt)
print(res)
コード実行結果:
'xx ! ! ! x123x xa3x'
例
文字数がゼロの場合も許容するようにしてみましょう:
txt = 'xx xabesx xaadx x123x xa3x'
res = re.sub('x[a-z]*x', '!', txt)
print(res)
結果は次のようになります:
'! ! ! ! x123x xa3x'
例
角括弧の中にエスケープされた文字を指定することもできます。文字と数字がゼロ回以上繰り返されるシーケンスを見つけてみましょう:
txt = 'xx x@x xadx xas12x xa3x'
res = re.sub('x[a-z\d]*x', '!', txt)
print(res)
コード実行結果:
'! x@x ! ! !'
例
別の角括弧自体を指定する必要がある場合も、必ずエスケープする必要があります:
txt = 'xx xrx xas[]x x3x'
res = re.sub('x[a-z\[\]]*x', '!', txt)
print(res)
コード実行結果:
'! ! ! x3x'
実践問題
次の文字列が与えられます:
txt = 'aba aea aca aza axa'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に文字'b'、'e'、または'x'がある。
次の文字列が与えられます:
txt = 'a1a a3a a7a a9a aba'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に3から6までの数字がある。
次の文字列が与えられます:
txt = 'aba aea afa aha aga'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に'a'から'g'までの文字がある。
次の文字列が与えられます:
txt = 'aba aea afa aha aga'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に'a'から'f'、または'j'から'z'までの文字がある。
次の文字列が与えられます:
txt = 'aAa aea aEa aJa a3a'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に'a'から'f'、または'A'から'D'までの文字がある。
次の文字列が与えられます:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に小文字のラテン文字がある(他の文字は含まない)。
次の文字列が与えられます:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に小文字および大文字のラテン文字がある(他の文字は含まない)。
次の文字列が与えられます:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
次のパターンに一致する正規表現を書いてください:両端に文字'a'があり、その間に小文字のラテン文字および数字がある(他の文字は含まない)。