正規表現は、文字列が特定のパターンに一致するかどうかを簡単に確認できる特別な文字のシーケンスです。 Python にはバージョン 1.5 以降、Perl スタイルの正規表現パターンを提供する re モジュールが追加されました。
re モジュールは、Python 言語に完全な正規表現機能をもたらします。
compile 関数は、パターン文字列とオプションのフラグ引数に基づいて正規表現オブジェクトを生成します。このオブジェクトには、正規表現の一致と置換のための一連のメソッドがあります。
re モジュールは、最初の引数としてパターン文字列を取る、これらのメソッドと同じ関数も提供します。
この章では主にPythonでよく使われる正規表現処理関数を紹介します。
re.match 関数
re.match は、文字列の先頭からパターンを照合しようとします。
関数の構文:
re.match(pattern, string, flags=0)
関数パラメータの説明:
パラメータ
説明
パターンマッチング正規表現式
string 照合する文字列。
flags フラグは、大文字と小文字を区別するかどうか、複数行のマッチングなど、正規表現のマッチング方法を制御するために使用されます。
re.match メソッドは、一致が成功した場合は一致するオブジェクトを返し、それ以外の場合は None を返します。
group(num) または groups() マッチングオブジェクト関数を使用して、マッチング式を取得できます。
マッチングオブジェクトメソッド
説明
group(num=0) 式全体の文字列と一致します。group() は一度に複数のグループ番号を入力できます。その場合、タプルを含む文字列が返されます。それらのグループに対応する値の。
groups() 1 から に含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。
例:
#!/usr/bin/python
import re
line = "猫は犬より賢い"
matchObj = re.match( r'(.* ) は (.*?) .*', 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 "一致しません!!"
上記の例の実行結果は以下の通りです:
matchObj.group() : 猫は犬より賢い
matchObj.group(1) : Cats
matchObj.group(2) : 賢い
re.search メソッド
re.match は、文字列の先頭からのパターンの一致を試みます。
関数の構文:
re.search(pattern, string, flags=0)
関数パラメータの説明:
パラメータ
説明
パターンマッチング正規表現式
string 照合する文字列。
flags フラグは、大文字と小文字を区別するかどうか、複数行のマッチングなど、正規表現のマッチング方法を制御するために使用されます。
re.search メソッドは、一致が成功した場合は一致するオブジェクトを返し、それ以外の場合は None を返します。
group(num) または groups() マッチングオブジェクト関数を使用して、マッチング式を取得できます。
マッチングオブジェクトメソッド
説明
group(num=0) 式全体の文字列と一致します。 group() は一度に複数のグループ番号を入力できます。その場合、A を含む文字列が返されます。それらのグループに対応する値のタプル。
groups() 1 から に含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。
例:
#!/usr/bin/python
import re
line = "猫は犬より賢い";
matchObj = re.match( r'(. *) は (.*?) .*'、行、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 "一致しません!!"
上記の例の実行結果は次のとおりです:
matchObj.group() : Cats are Smarter than Dog
matchObj.group(1) : Cats
matchObj.group(2) :より賢い
re.match と re.search の違い
re.match は文字列の先頭のみを照合します。文字列の先頭が正規表現と一致しない場合、関数は None を返します。一方、re.search は一致する文字列が見つかるまで文字列全体を照合します。
例:
#!/usr/bin/python
import re
line = "猫は犬より賢い";
matchObj = re.match( r'dogs' 、line、re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "一致しません!! "
matchObj = re.search(r'dogs', line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj. group()
else:
print "No match!!"
上記の例の結果は次のとおりです。 : 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"
# Python スタイルのコメントを削除
num = re.sub(r'#.*$', "",phone)
print "Phone Num : ", num
# 数字以外を削除します
num = re.sub(r 'D', "",phone)
print "Phone Num: ", num
上記の実行結果例は次のとおりです:
Phone Num : 2004-959-559
電話番号 : 2004959559
正規表現修飾子 - オプションのフラグ
正規表現には、一致したパターンを制御するためのオプションのフラグ修飾子をいくつか含めることができます。修飾子はオプションのフラグとして指定されます。複数のフラグはビット単位の OR(|) で指定できます。たとえば、 re.I | re.M は I フラグと M フラグに設定されます:
Modifier
Description
re.I 一致を大文字と小文字を区別しないようにします
re.L ローカリゼーション認識を行います (locale -認識しています)
re.M に一致します ^ と $ に影響する複数行の一致
re.S Make. 改行を含むすべての文字に一致します
re.U Unicode 文字セットに従って文字を解析します。このフラグは、w、W、b、B に影響します。
re.X このフラグにより、より柔軟な形式が提供されるため、正規表現の記述が容易になります。
正規表現パターン
パターン文字列は、特別な構文を使用して正規表現を表します:
文字と数字はそれ自体を表します。正規表現パターン内の文字と数字は、同じ文字列と一致します。
ほとんどの文字と数字の前にバックスラッシュがあると、異なる意味を持ちます。
句読点文字は、エスケープされている場合にのみ一致し、エスケープされていない場合は特別な意味を表します。
バックスラッシュ自体はバックスラッシュでエスケープする必要があります。
通常、正規表現にはバックスラッシュが含まれるため、それらを表すには生の文字列を使用することをお勧めします。パターン要素 (「//t」に相当する r'/t' など) は、対応する特殊文字と一致します。
次の表に、正規表現パターン構文の特別な要素を示します。パターンを使用し、オプションのフラグ引数を指定すると、一部のパターン要素の意味が変わります。
パターン
説明
^ 文字列の先頭と一致します
$ 文字列の末尾と一致します。
。改行文字を除く任意の文字と一致します。 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 は括弧内の式に一致し、a も表します
(?imx) 正規表現には、i、m、x の 3 つのオプションのフラグが含まれています。括弧内の領域にのみ影響します。
(?-imx) i、m、または x のオプションのフラグをオフにする正規表現。括弧内の領域にのみ影響します。
(?: re) (...) と似ていますが、グループを表しません
(?imx: re) Do では i、m、または x のオプションのフラグを括弧内で使用します
(?-imx: re)括弧内の i、m、または x のオプションのフラグは使用しないでください。
(?#...) コメント
(?= re) 前方正の区切り文字。 ... で示される、含まれている正規表現が現在の位置と正常に一致する場合は成功し、そうでない場合は失敗します。しかし、含まれている式が試行されると、マッチング エンジンはまったく改善されず、パターンの残りの部分は依然として区切り文字の右側を試行する必要があります。
(?! re) 前方負の区切り文字。正の区切り文字とは異なり、含まれる式が文字列の現在位置で一致しない場合に成功します
(?> re) スタンドアロン パターンが一致し、バックトラッキングが排除されます。
w 英数字と一致します
W 英数字以外の文字と一致します
s [tnrf] と同等の任意の空白文字と一致します
S 空でない文字と一致します
d [0-9 と同等の任意の数字と一致します。 ]。
D 数値以外の文字列と一致します。
A 文字列の先頭と一致します。
Z 文字列の末尾と一致します。 改行がある場合は、改行の前の最後の文字列のみが一致します。 c
z 文字列の末尾と一致します
G 最後の一致が完了した位置と一致します。
b 単語とスペースの間の位置を指す単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「動詞」の「er」とは一致しません。
B 単語以外の境界に一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。
n、t など。改行文字と一致します。タブ文字と一致します。など。
1...9 は、n 番目のグループの部分式と一致します。
10 n 番目のグループの部分式が一致する場合、その部分式と一致します。それ以外の場合は、8 進数の文字コードの表現を指します。
正規表現の例
文字の一致
例
説明
python
文字クラス
インスタンス
説明
[Pp]python Match" Python " または "python"
rub[ye] "ruby" または "rube" と一致します
[aeiou] 角括弧内の任意の文字と一致します
[0-9] 任意の数値と一致します。 [0123456789] に類似
[a-z] 任意の小文字と一致
[A-Z] 任意の大文字と一致
[a-zA-Z0-9] 任意の文字と数字と一致
[^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_]」と同等。