プログラミングで複雑なルールによる入力チェックや、文字列置換を行いたい時に正規表現を使えると非常に便利です。
複雑な入力チェックの処理をいくつも記述すると分かりづらいコードで、不具合の原因となる場合もあります。
正規表現を用いるとシンプルな記述方法で、簡潔なロジックで表すことができます。
その一方で、正規表現自体の記述方法はルールがたくさんあり、すべてを覚えるのは困難です。
必要な時に調べれば良いので、すべてを覚える必要はないと思いますが、どんなことができるのかは知っておく必要があります。
そこで本記事では、Pythonの正規表現についての記述方法やできることについてまとめます。
プログラミング初心者の方の学習や、忘れてしまった方の復習として、参考にしていただければ幸いです。
記載しているプログラムは、Python3.6.8を使って動作確認をしています。
Pythonの正規表現
Pythonの正規表現として以下の内容を採り上げます。
- 正規表現の作成方法
- 正規表現による文字列チェック
- 正規表現による文字列置換
- 正規表現による文字列抽出
- 正規表現のエスケープ
正規表現の作成方法
Pythonで正規表現を扱うには、標準で提供されている reモジュール を使います。
reモジュールを使うにはインポートが必要になります。
import re
正規表現はそのまま表現可能なRaw文字列記法で表現します。
Raw文字列記法は、先頭に r を付けます。
regex = r'abc'
また、この正規表現をRaw文字列の状態で使う方法と、一旦コンパイルして使う方法があります。
何度も同じ正規表現を利用する場合はコンパイルして使うほうが効率よく使うことができます。
本記事ではコードの簡素化のためにコンパイルせずに使用します。
正規表現にはたくさんの特殊文字やオプションがありますが、詳細は公式ドキュメントをご参照ください。
正規表現による文字列チェック
正規表現による文字列チェックは、match、search、findall、fullmatchを使う方法があります。
matchメソッド
matchメソッドは、指定した文字列の先頭が正規表現にマッチするとマッチオブジェクトを返します。
str = "Hello Python!!" regex = r'Hello' r = re.match(regex, str) print(r.group()) # -> Hello
先頭が一致しない場合はNoneを返します。
str = "Hello Python!!" regex = r'python' r = re.match(regex, str, re.I) print(r) # -> None
上記のプログラムで、matchメソッドの第3引数にはオプションを指定することができます。
re.Iは、大文字小文字を区別せずに判定するオプションです。
searchメソッド
searchメソッドは、指定した文字列全体に対して正規表現にマッチするとマッチオブジェクトを返します。
複数にマッチする場合は、先頭から最初にマッチしたマッチオブジェクトとなります。
str = "Hello Python!!" regex = r'Hello' r = re.search(regex, str) print(r.group()) # -> Hello
matchメソッドではマッチしなかった正規表現も、searchではマッチする結果となります。
str = "Hello Python!!" regex = r'python' r = re.search(regex, str, re.I) print(r.group()) # -> Python
findallメソッド
findallメソッドは、正規表現にマッチするすべての文字列をリストで返します。
str = "Hello Python!!" regex = r'python' r = re.findall(regex, str, re.I) print(r) # -> ['Python']
fullmatchメソッド
fullmatchメソッドは、文字列全体が正規表現にマッチしている場合にマッチオブジェクトを返します。
str = "Hello Python!!" regex = r'H.+ P.+!!' r = re.fullmatch(regex, str) print(r.group()) # -> Hello Python!!
正規表現による文字列置換
正規表現による文字列置換は、subを使います。
str = "Hello World!!" regex = r'World' rep = "Python" print(re.sub(regex, rep, str)) # -> Hello Python!!
subメソッドの第1引数に正規表現を指定し、第2引数に置換後の文字列、第3引数に置換前の文字列を指定します。
正規表現にマッチする文字列を置換した文字列を戻り値として返します。
正規表現による文字列抽出
正規表現で指定した部分を文字列から抽出するには、抽出したいパターンに括弧を含めて指定します。
subメソッドで抽出した文字列を使って置換をする場合は、抽出した文字列を\1、\2を使って取得します。
str = "Hello Python!!" regex = r'(\w+)\s(\w+)' rep = re.sub(regex, r'\2 \1', str) print(rep) # -> Python Hello!!
matchメソッドで抽出した文字列を取得する場合は、groupのインデックス1が1つ目に抽出した文字列になります。
また、groupsで抽出した全体をタプルで取得することができます。
str = "Hello Python!!" regex = r'(\w+)\s(\w+)' r = re.match(regex, str) print(r.groups()) # -> ('Hello', 'Python') print(r.group(1)) # -> Hello print(r.group(2)) # -> Python
正規表現のエスケープ
正規表現においてピリオドやプラス、アスタリスクなどの記号は、特殊文字として定義されている文字です。
これらを文字列に含んでいる場合の正規表現を作成する場合は、特殊文字として扱われないようにエスケープする必要があります。
エスケープは、特殊文字の直前にバックスラッシュを付けます。
str = "Hello+Python." regex = r'^\w+\+\w+\.$' r = re.match(regex, str) print(r.group()) # -> Hello+Python.
上記のプログラムでは、プラスとピリオドの直前にバックスラッシュを入れてエスケープした正規表現を作成しています。
また、プログラムによって文字列をエスケープさせるには、escapeを使います。
str = "Hello+Python." regex = re.escape(str) r = re.match(regex, str) print(regex) # -> Hello\+Python\. print(r.group()) # -> Hello+Python.
正規表現はプログラム外でも役に立つ
正規表現はプログラムをシンプルにしてくれる便利なものですが、プログラム外でも役に立つことがあります。
エディタを使って文章を書いている際に、文字列の検索や置換をしたくなった場合に、正規表現で指定することが可能なエディタもあります。
Linuxのコマンドでも正規表現を使えるコマンドがたくさんあります。
Excelの関数などでも正規表現を使うことができます。
正規表現で書いてみたけど、思うようにマッチしないという場合には、正規表現チェッカーというツールで分かりやすく一致部分を表現してくれるツールもありますので活用してみてください。
正規表現は記述方法が難しいのですが、書けると非常に効率を上げてくれる手段になります。
サラッと正規表現を書ける人はカッコいいですよね。
今回はPythonの正規表現についてまとめました。
以上、参考になれば幸いです。
コメント