Python の正規表現


正規表現は、文字列が特定のパターンに一致するかどうかを簡単に確認するのに役立つ特殊な文字シーケンスです。

Python はバージョン 1.5 以降、Perl スタイルの正規表現パターンを提供する re モジュールを追加しました。

re モジュールは、Python 言語に完全な正規表現機能をもたらします。

compile 関数は、パターン文字列とオプションのフラグ引数に基づいて正規表現オブジェクトを生成します。このオブジェクトには、正規表現の一致と置換のための一連のメソッドがあります。

re モジュールは、最初の引数としてパターン文字列を取る、これらのメソッドと同じ関数も提供します。

この章では主にPythonでよく使われる正規表現処理関数を紹介します。


re.match 関数

re.match は、文字列の開始位置からのパターンのマッチングを試みます。開始位置でのマッチングが成功しなかった場合、match() は none を返します。

関数構文:

re.match(pattern, string, flags=0)

関数パラメータの説明:

パラメータの説明
パターン一致する正規表現
文字列 照合する文字列。
flagsflags は、大文字と小文字を区別するかどうか、複数行のマッチングなど、正規表現のマッチング方法を制御するために使用されます。

re.match メソッドは、一致が成功した場合は一致するオブジェクトを返し、それ以外の場合は None を返します。

group(num) または groups() マッチングオブジェクト関数を使用して、マッチング式を取得できます。

マッチングオブジェクトのメソッド 説明
group(num=0) 式全体の文字列が一致しました。group() は一度に複数のグループ番号を入力できます。その場合はタプルを返します。それらのグループに対応する値が含まれます。
groups() 1 から含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。

インスタンス 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.match('com', 'www.php.cn'))         # 不在起始位置匹配

上記の例の出力結果は次のとおりです:

(0, 3)
None

インスタンス 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

上記の例の実行結果は次のとおりです:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search メソッド

re.search は文字列全体をスキャンし、最初に一致したものを返します。

関数構文:

re.search(pattern, string, flags=0)

関数パラメータの説明:

パラメータ 説明
pattern 一致する正規表現
string照合する文字列。
flagsflags は、大文字と小文字を区別するかどうか、複数行のマッチングなど、正規表現のマッチング方法を制御するために使用されます。

re.search メソッドは、一致が成功した場合は一致するオブジェクトを返し、それ以外の場合は None を返します。

group(num) または groups() マッチングオブジェクト関数を使用して、マッチング式を取得できます。

マッチングオブジェクトのメソッド 説明
group(num=0) 式全体の文字列が一致しました。group() は一度に複数のグループ番号を入力できます。その場合はタプルを返します。それらのグループに対応する値が含まれます。
groups() 1 から含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。

インスタンス 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.search('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.search('com', 'www.php.cn').span())         # 不在起始位置匹配

上記のインスタンスの出力結果は次のとおりです:

(0, 3)
(11, 14)

インスタンス 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
上記のインスタンスの実行結果は次のとおりです:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match と re.search の違いbetween

re.match のみ 文字列の先頭が正規表現と一致しない場合、関数は None を返しますが、re.search は一致が見つかるまで文字列全体を照合します。

例:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
上記の例の結果は次のとおりです:
No match!!
search --> matchObj.group() :  dogs

取得と置換

Python の re モジュールは、文字列内の一致を置換するための re.sub を提供します。

構文:

re.sub(pattern, repl, string, max=0)

返された文字列は、文字列内の RE の左端の反復しない一致に置き換えられます。パターンが見つからない場合、文字は変更されずに返されます。

オプションのパラメーター count は、パターン マッチング後の置換の最大数です。count は負でない整数である必要があります。デフォルト値は 0 で、すべての一致が置き換えられます。

例:

#!/usr/bin/python
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num
上記の例の実行結果は次のとおりです:
Phone Num :  2004-959-559
Phone Num :  2004959559

正規表現修飾子 - オプションのフラグ

正規表現には、一致するパターンを制御するためのオプションのフラグ修飾子をいくつか含めることができます。修飾子はオプションのフラグとして指定されます。複数のフラグはビット単位の OR(|) で指定できます。たとえば、 re.I | re.M は I と M に設定されます。 フラグ:

修飾子説明
re.I大文字と小文字を区別しないで一致させます
re.L ロケールを考慮したマッチングを実行します
re.M ^ と $
re.Smake に影響する複数行のマッチングを行います
re.Uparse Unicode 文字セットに従った文字。このフラグは、w、W、b、B に影響します。
re.Xこのフラグにより​​、より柔軟な形式が提供されるため、正規表現の記述が容易になります。

正規表現パターン

パターン文字列は、特別な構文を使用して正規表現を表します:

文字と数字はそれ自体を表します。正規表現パターン内の文字と数字は、同じ文字列と一致します。

ほとんどの文字と数字の前にバックスラッシュがあると、異なる意味を持ちます。

句読点文字は、エスケープされている場合にのみ一致し、エスケープされていない場合は特別な意味を表します。

バックスラッシュ自体はバックスラッシュでエスケープする必要があります。

通常、正規表現にはバックスラッシュが含まれるため、それらを表すには生の文字列を使用することをお勧めします。パターン要素 (「//t」に相当する r'/t' など) は、対応する特殊文字と一致します。

次の表に、正規表現パターン構文の特別な要素を示します。パターンを使用し、オプションのフラグ引数を指定すると、一部のパターン要素の意味が変わります。

wは英数字とアンダースコアに一致しますWは英数字以外とアンダースコアに一致しますsは[tnrf]に相当する任意の空白文字に一致します Sの試合空でない文字dは、[0-9]に相当する任意の数値と一致します。Dは、数値以外の任意の文字と一致しますAは、文字列の先頭と一致しますZ は文字列の末尾に一致します。改行がある場合は、改行の前の文字列の末尾のみが一致します。 czは文字列の末尾に一致しますGは最後の一致が完了した位置に一致します。 b は、単語とスペースの間の位置を指す単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。 B は単語以外の境界に一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。 n、t など。 は改行文字と一致します。タブ文字と一致します。など。 1...9 は、n 番目のグループの部分式と一致します。 10 は、n 番目のグループの部分式が一致する場合、それと一致します。それ以外の場合は、8 進数の文字コードの表現を指します。
パターン 説明
^ 文字列の先頭と一致します
$ 文字列の末尾と一致します。
. は、改行文字を除く任意の文字に一致します。 re.DOTALL フラグが指定されている場合、改行文字を含む任意の文字に一致します。
[...]は、個別にリストされた文字のグループを表すために使用されます: [amk] は、'a'、'm'、または 'k' に一致します
[^...] [] 内の文字: [^abc] は、a、b、c 以外の文字と一致します。
re* は 0 個以上の式と一致します。
re+ は 1 つ以上の式と一致します。
re?貪欲でない方法で、前の正規表現で定義された0または1つのフラグメントと一致します
re{ n}
re{ n,} n 個の前の式と完全に一致します。
re{ n, m} は、前の正規表現で定義されたフラグメントの n 倍から m 倍の貪欲な方法で一致します
a b は a または b と一致します
(re) G は括弧内の式と一致し、グループ
(?imx) も表します。正規表現には、i、m、または x の 3 つのオプションのフラグが含まれます。括弧内の領域にのみ影響します。
(?-imx) i、m、または x のオプションのフラグをオフにする正規表現。括弧内の領域にのみ影響します。
(?: re)Like (...) ですが、グループを表しません
(?imx: re)括弧内に i、m、または x のオプションのフラグを使用します
(?-imx: re)かっこ内の i、m、x のオプションのフラグは使用しないでください
(?#...)Comments.
(?= re) Forward正の区切り文字。 ... で示される、含まれている正規表現が現在の位置と正常に一致する場合は成功し、そうでない場合は失敗します。しかし、含まれている式が試行されると、マッチング エンジンはまったく改善されず、パターンの残りの部分は依然として区切り文字の右側を試行する必要があります。
(?! re)前方負の区切り文字。正の区切り文字とは反対に、含まれる式が文字列の現在位置で一致しない場合に成功します
(?> re) 独立したパターンが一致したため、バックトラッキングの必要がなくなります。

正規表現の例

文字の一致

例説明pythonmatch "python".

文字クラス

特殊文字クラス
インスタンス説明
[Pp]ythonは「Python」または「python」と一致します
rub[ye]は「ruby」または「rube」と一致します
[aeiou]は角かっこ内の任意の文字と一致します。
[0-9]は任意の数値と一致します。 [0123456789]に類似& ; 数字
[^aeiou] aeiou 文字を除くすべての文字
[^0-9]は数字以外の文字と一致します
説明
. 「n」を除く任意の 1 文字と一致します。 「n」を含む任意の文字と一致するには、「[.n]」のようなパターンを使用します。
d

は数字と一致します。 [0-9]に相当します。
Dは、数字以外の文字と一致します。 [^0-9] と同等。
s は、スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S は、空白以外の文字と一致します。 [^ fnrtv] に相当します。
wは、アンダースコアを含む任意の単語文字に一致します。 「[A-Za-z0-9_]」と同等。
Wは、単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。