正規表現の仕組みを復習する必要がある場合は、まずインタラクティブチュートリアルを確認してください!
Pythonは、すべてのPythonインストールにバンドルされている標準のpythonライブラリreを通じて正規表現をサポートしています。このライブラリは完全にPCRE互換ではありませんが、正規表現の一般的なユースケースの大部分をサポートしています。
Pythonで正規表現を記述する場合、通常のPython文字列の代わりにraw文字列を使用することをお勧めします。raw文字列は、特別なプレフィックス(r)で始まり、Pythonが文字列内のバックスラッシュと特殊なメタ文字を解釈しないように指示し、正規表現エンジンに直接渡せるようにします。
つまり、"\n\w"のようなパターンは解釈されず、他の言語のように"\\n\\w"の代わりにr"\n\w"として記述できます。これははるかに読みやすくなります。
reパッケージには多くのトップレベルメソッドがあり、Pythonで正規表現が特定の文字列にマッチするかどうかをテストするには、re.search()を使用できます。このメソッドは、パターンが一致しない場合はNoneを返し、一致が見つかった文字列の部分に関する追加情報を含むre.MatchObjectを返します。
このメソッドは最初の一致で停止するため、データを抽出するよりも正規表現をテストするのに最適であることに注意してください。
matchObject = re.search(pattern, input_str, flags=0)
import re # 正規表現を使って日付文字列にマッチさせましょう。 # 正規表現がマッチするかどうかをテストするだけなので、出力は無視します。 regex = r"([a-zA-Z]+) (\d+)" if re.search(regex, "June 24"): # 確かに、式"([a-zA-Z]+) (\d+)"は日付文字列にマッチします。 # 必要に応じて、MatchObjectのstart()メソッドとend()メソッドを使用して、 # パターンが入力文字列のどこにマッチするかを検索したり、 # group()メソッドを使用してすべての一致とキャプチャされたグループを取得したりできます。 match = re.search(regex, "June 24") # これは、文字列の先頭と末尾にマッチするため、[0, 7)を出力します。 print "Match at index %s, %s" % (match.start(), match.end()) # グループには、マッチした値が含まれています。特に: # match.group(0)は常に完全にマッチした文字列を返します # match.group(1)、match.group(2)、...は、キャプチャグループを # 入力文字列で左から右の順に返します # match.group()はmatch.group(0)と同等です # したがって、これは「June 24」を出力します。 print "Full match: %s" % (match.group(0)) # したがって、これは「June」を出力します。 print "Month: %s" % (match.group(1)) # したがって、これは「24」を出力します。 print "Day: %s" % (match.group(2)) else: # re.search()が一致しない場合は、Noneが返されます print "The regex pattern does not match. :("
上記のre.search()メソッドとは異なり、re.findall()を使用して、入力文字列全体でグローバル検索を実行できます。パターンにキャプチャグループがある場合、キャプチャされたすべてのデータのリストを返しますが、それ以外の場合は、一致自体をリストで返すか、一致が見つからない場合は空のリストを返します。
各一致の追加のコンテキストが必要な場合は、代わりにre.MatchObjectsのイテレータを返してウォークスルーするre.finditer()を使用できます。どちらのメソッドも同じパラメータを受け取ります。
matchList = re.findall(pattern, input_str, flags=0)
matchList = re.finditer(pattern, input_str, flags=0)
import re # いくつかの日付文字列にマッチさせるために正規表現を使用しましょう。 regex = r"[a-zA-Z]+ \d+" matches = re.findall(regex, "June 24, August 9, Dec 12") for match in matches: # これは以下を出力します: # June 24 # August 9 # Dec 12 print "Full match: %s" % (match) # 各日付の特定の月をキャプチャするには、次のパターンを使用できます regex = r"([a-zA-Z]+) \d+" matches = re.findall(regex, "June 24, August 9, Dec 12") for match in matches: # これは以下を出力します: # June # August # Dec print "Match month: %s" % (match) # 各一致の正確な位置が必要な場合 regex = r"([a-zA-Z]+) \d+" matches = re.finditer(regex, "June 24, August 9, Dec 12") for match in matches: # これは以下を出力します。 # 0 7 # 9 17 # 19 25 # これは、入力文字列内の各一致の開始と終了に対応しています print "Match at index: %s, %s" % (match.start(), match.end())
別の一般的なタスクは、正規表現を使用して文字列の一部を検索および置換することです。たとえば、古いメールドメインのすべてのインスタンスを置換したり、一部のテキストの順序を入れ替えたりします。これは、Pythonではre.sub()メソッドを使用して実行できます。
オプションのcount引数は、入力文字列で行う置換の正確な数であり、この値がゼロ以下の場合、文字列内のすべての一致が置換されます。
replacedString = re.sub(pattern, replacement_pattern, input_str, count, flags=0)
import re # 日付文字列の日と月の順序を逆にするようにしましょう。 # 置換文字列にはメタ文字(キャプチャされたグループへの # 後方参照)も含まれているため、これもraw文字列を使用します。 regex = r"([a-zA-Z]+) (\d+)" # これは文字列の順序を入れ替え、以下を出力します。 # 24 of June, 9 of August, 12 of Dec print re.sub(regex, r"\2 of \1", "June 24, August 9, Dec 12")
reフラグ上記のPython正規表現メソッドでは、それぞれオプションのflags引数も受け取ることがわかります。使用可能なフラグのほとんどは便宜的なものであり、正規表現自体に直接記述できますが、特定のケースでは役立つものもあります。
re.IGNORECASEは、パターンを大文字と小文字を区別しないようにし、大文字と小文字が異なる文字列に一致するようにします。re.MULTILINE は、入力文字列に改行文字 (\n) が含まれる場合に必要です。このフラグを使用すると、開始と終了のメタ文字 (それぞれ ^ と $) が、入力文字列全体の先頭と末尾ではなく、各行の先頭と末尾に一致するようになります。re.DOTALL を使用すると、ドット (.) メタ文字が改行文字 (\n) を含むすべての文字に一致するようになります。Python では、多数の文字列に一致する新しい正規表現パターンを作成すると処理が遅くなる可能性があるため、同じ式を使用して多数の入力文字列をテストしたり、情報抽出する必要がある場合は、それらをコンパイルすることが推奨されます。このメソッドは re.RegexObject を返します。
regexObject = re.compile(pattern, flags=0)
返されたオブジェクトには、上記とまったく同じメソッドがありますが、入力文字列を受け取り、各呼び出しでパターンまたはフラグを必要としなくなる点が異なります。
import re # パターンを作成し、それを使って情報を抽出しましょう regex = re.compile(r"(\w+) World") result = regex.search("Hello World is the easiest") if result: # これは以下を出力します: # 0 11 # 一致の開始と終了位置 print result.start(), result.end() # これは以下を出力します: # Hello # Bonjour # 一致したキャプチャグループごと for result in regex.findall("Hello World, Bonjour World"): print result # これは "World" を "Earth" で置換し、以下を出力します: # Hello Earth print regex.sub(r"\1 Earth", "Hello World")
Python での正規表現の使用に関する詳細については、次のリンクをご覧ください。