「正規表現で『Pythonまたはパイソン』のように2種類以上のいずれかにマッチさせたい」
という疑問に答えるための記事です。
プログラミングの正規表現を使う場合、「似たような意味の言葉をマッチさせたい場合」や「日本語と英語両方マッチさせたい」という場合があると思います。
2パターン並べて別々にチェックする方法もありますが、出来るだけ1ステップで解決したいですよね。
正規表現で「〇〇または△△」でマッチさせたい場合は特殊記号の「|」(パイプ)を使用して、「〇〇|△△」のように記述します。
「〇〇|△△|□□」のように記述することも可能です。
本記事では特殊記号の「|」の使い方や記述例などについて説明します。
具体的には以下の2点です。
・正規表現で「〇〇または△△」をマッチさせるには?
・Pythonの正規表現で「〇〇または△△」」マッチの記述
正規表現をうまく活用して記述するコードを減らすようにしましょう。
目次
正規表現で「〇〇または△△」をマッチさせるには?
正規表現で「〇〇または△△」のマッチに使用する特殊記号「|」(パイプ)について説明します。
具体的には以下の2点についての説明です。
・2つの言葉をマッチさせる例
・3つ以上の言葉をマッチさせる例
2つの言葉をマッチさせる例
「Python」と「パイソン」にマッチさせたい場合の記述例です。
以下の通り単純にパイプにつなぐだけ。
上記の記述をした場合「Python」と「パイソン」の両方にマッチします。
3つ以上の言葉をマッチさせる例
3つ以上の言葉をマッチさせる場合も基本的な考え方は同じでさらにパイプで繋ぐだけです。
「Python」と「パイソン」と「ぱいそん」の3つを比較した場合は以下のように記述します。
上記の記述をした場合「Python」と「パイソン」と「ぱいそん」の全てにマッチします。
Pythonの正規表現で「〇〇または△△」」マッチの記述
1 2 3 4 5 6 7 | import re # Pythonを含む文字列をマッチ pattern = re.compile('(Python|パイソン).*') print(pattern.match('Pythonの勉強中です。')) print(pattern.match('パイソンの勉強中です。')) print(pattern.match('ぱいそんの勉強中です。')) |
「.*」は「0文字以上の改行以外の文字列」を意味します。
◆実行結果
以下の通り「ぱいそん」だけマッチしない
1 2 3 | <re.Match object; span=(0, 13), match='Pythonの勉強中です。'> <re.Match object; span=(0, 11), match='パイソンの勉強中です。'> None |
「ぱいそん」もマッチさせたい場合はさらにパイプで繋ぎます。
1 2 3 4 5 6 7 | import re # Pythonを含む文字列をマッチ pattern = re.compile('(Python|パイソン|ぱいそん).*') print(pattern.match('Pythonの勉強中です。')) print(pattern.match('パイソンの勉強中です。')) print(pattern.match('ぱいそんの勉強中です。')) |
◆実行結果
全ての文字列にマッチ。
1 2 3 | <re.Match object; span=(0, 13), match='Pythonの勉強中です。'> <re.Match object; span=(0, 11), match='パイソンの勉強中です。'> <re.Match object; span=(0, 11), match='ぱいそんの勉強中です。'> |
どの文字でマッチしたか見たい場合はマッチ結果の配列をチェックします。
match[0]:比較した文字列全体を格納する
match[1]以降:()でグループ化した文字列を格納する
1 2 3 4 5 6 7 8 9 | import re # Pythonを含む文字列をマッチ pattern = re.compile('(Python|パイソン|ぱいそん)(.*)') match = pattern.match('Pythonの勉強中です。') print(match[0]) # マッチした文字列 print(match[1]) print(match[2]) |
◆実行結果
1 2 3 | Pythonの勉強中です。 Python の勉強中です。 |
上記例では、match[1]に格納されましたが、「re.compile('(.*)(Python|パイソン|ぱいそん)(.*)')」のように前方に()で括られたグループがある場合はその数だけインデントがずれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import re # 2番目にある場合 pattern = re.compile('(.*)(Python|パイソン|ぱいそん)(.*)') match = pattern.match('今日はPythonの勉強をしました。') print('match[1]:' + match[1]) print('match[2]:' + match[2]) print('match[3]:' + match[3]) # 3番目にある場合 pattern = re.compile('(.*)は(.*)の(Python|パイソン|ぱいそん)の勉強をしました。') match = pattern.match('今日はプログラミング言語のPythonの勉強をしました。') print('match[1]:' + match[1]) print('match[2]:' + match[2]) print('match[3]:' + match[3]) |
◆実行結果
1 2 3 4 5 6 7 | match[1]:今日は match[2]:Python match[3]:の勉強をしました。 match[1]:今日 match[2]:プログラミング言語 match[3]:Python |
終わりに
正規表現で「〇〇または△△」でマッチさせたい場合は特殊記号の「|」(パイプ)を使用して、「〇〇|△△」のように記述するという話でした。
グループ化すればどの値でマッチしたかチェックすることができるのでマッチした値によって処理を変えるといったことも可能です。
正規表現はパッと見訳がわからないと感じる方も多いと思います。
私も理解するのにかなり苦労しました。
なかなか理解できないという人は実際にプログラムを作って試してみるのがおすすめです。
眺めているだけだと全然わからないけど動かしてみたらあっさり理解できたりします。
当サイトの「正規表現チェッカー」も使ってみてね。
以上、正規表現で「〇〇または△△」をマッチさせる方法でした。
正規表現まとめ>>Python正規表現の特殊記号と記述方法まとめ