ホームページ  >  記事  >  バックエンド開発  >  Python の re モジュール正規表現操作

Python の re モジュール正規表現操作

高洛峰
高洛峰オリジナル
2017-03-02 16:08:141209ブラウズ

このモジュールは、Perl と同様の正規表現マッチング操作を提供します。同じことが Unicode 文字列にも当てはまります。

正規表現は特殊な形式を表すため、またはエスケープ文字としてバックスラッシュ「 」を使用しますが、これは Python の構文と競合します。そのため、正規表現が「 」と一致する必要がある場合、Python は正規表現で「 」を表すために「 \\ 」を使用します。数式では、エスケープして " \ " に変える必要があります。また、Python 構文では、文字列内の各文字をエスケープする必要があるため、" \\ " になります。

上記の書き方は面倒だと思いませんか? 正規表現を読みやすくするために、Python は特別に設計した生の文字列を使用しないでください。ここには落とし穴があります。生の文字列は、r"n" など、文字列の接頭辞として「r」を使用します。これは、改行文字の代わりに 2 つの文字「」と「n」を表します。 Python で正規表現を記述する場合は、この形式をお勧めします。

ほとんどの正規表現操作は、モジュールレベルの関数または RegexObject メソッドと同じ目的を達成できます。また、正規表現オブジェクトを最初からコンパイルする必要はありませんが、実際的な微調整パラメータを使用することはできません。

1. 正規表現の構文

スペースを節約するため、ここでは説明しません。

2. March と search の違い

Python には、match と search という 2 つの異なる基本操作があります。一致は文字列の開始点から開始されますが、検索 (Perl のデフォルト) は文字列から一致を開始します。

注: 正規表現が「^」で始まる場合、一致と検索は同じです。 match は、一致した文字列が先頭から一致するか、pos パラメータの位置から一致できる場合にのみ成功します。次のように:

>>> re.match("c", "abcdef")
>>> " )
<_sre.SRE_Match オブジェクト 0x00A9A988>
>>> re.match("c", "cabcdef")
<_sre.SRE_Match オブジェクト 0x00A9AB80>
>>> re。 search ("c","cabcdef")
<_sre.SRE_Match オブジェクト at 0x00AF1720>>>> patterm = re.compile("c")
>>> " )
>>> patterm.match("abcdef",1)
>>> patterm.match("abcdef",2)



3. モジュールの内容
re.compile(pattern, flags=0)


正規表現をコンパイルして RegexObject オブジェクトを返すと、RegexObject を通じて match() メソッドと search() メソッドを呼び出すことができます物体。


prog = re.compile(pattern)

result = prog.match(string)



は、


result = re.match(pattern, string)


と同等です。


最初の方法は、正規表現の再利用を実現できます。


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


文字列内を検索して、正規表現と一致するかどうかを確認します。 _sre.SRE_Match オブジェクトを返すか、一致するものが見つからない場合は None を返します。


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


文字列の先頭が正規表現と一致するかどうか。 _sre.SRE_Match オブジェクトを返すか、一致するものが見つからない場合は None を返します。


re.split(pattern, string, maxsplit=0)


正規表現を使用して文字列を分割します。正規表現を括弧で囲むと、一致する文字列もリストに含まれて返されます。 maxsplit は分離の回数です。maxsplit=1 は 1 回分離します。デフォルトは 0 で、回数に制限はありません。


>>> re.split('W+', '単語、単語、単語。')

['単語', '単語', '単語', '']

>>> re.split('(W+)', '単語、単語、単語。')
['単語', ', ', '単語', ', ', '単語', '.', '']
> ;>> re.split('W+', '単語、単語。', 1)
['単語'、'単語、単語。']
>>> a-f]+', '0a3B9', flags=re.IGNORECASE)


注: 私は Python 2.6 を使用しています。ソース コードを見ると、split() には 2.7 で追加された flags パラメータがないことがわかりました。 。私はこの問題を何度も発見しました。公式ドキュメントがソース コードと矛盾している場合は、ソース コードを参照してその理由を見つける必要があります。


文字列の先頭または末尾に一致がある場合、返されるリストは空の文字列で始まるか空の文字列で終わります。

>>> re.split('(W+)', '...単語、単語...')
['', '...', '単語', ', ', '単語', '...', '']

文字列が一致しない場合は、文字列全体のリストが返されます。

>>> re.split("a","bbb")
['bbb']

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

RE 一致を見つけるすべての部分文字列をリストとして返します。一致は左から右の順序で返されます。一致するものがない場合は、空のリストが返されます。

>>> re.findall("a","bcdef")
[]

>re.findall(r"d+","12a32bc43jf3")

['12 ', '32', '43', '3']

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


RE と一致するすべての部分文字列を検索し、反復子として返します。一致は左から右の順序で返されます。一致するものがない場合は、空のリストが返されます。


>>> it = re.finditer(r"d+","12a32bc43jf3")

>>> 内の一致:
print match.group()

re.sub(pattern) 、repl、string、count=0、flags=0)


RE に一致するすべての部分文字列を検索し、別の文字列に置き換えます。オプションの引数 count は、パターン一致後の置換の最大数です。count は非負の整数である必要があります。デフォルト値は 0 で、すべての一致が置き換えられます。一致するものがない場合、文字列は変更されずに返されます。


re.subn(pattern, repl, string, count=0, flags=0)


は、re.subメソッドと同じ効果がありますが、新しい文字列と置換の数を含む2つのタプルを返します。実行時間。


re.escape(string)


文字列内の英数字以外の文字をエスケープ


re.purge()


キャッシュ内の正規表現をクリア


4. 正規表現Formulaオブジェクト

re.RegexObject


re.compile() は RegexObject オブジェクトを返します


re.MatchObject


group() は RE


start() によって一致した文字列を返します 一致の開始位置を返します


end() は一致が終了する位置を返します


span() は一致の位置 (開始、終了) を含むタプルを返します


5. コンパイルフラグ

コンパイルフラグは以下を許可します正規表現の動作方法の一部を変更する必要があります。 re モジュールでは、フラグに 2 つの名前を使用できます。1 つは IGNORECASE などの完全名、もう 1 つは I などの 1 文字の省略形です。 (Perl のモード変更に精通している場合は、1 文字形式で同じ文字が使用されます。たとえば、re.VERBOSE の略語は re.X です。) 複数のフラグは、ビット単位の OR で指定できます。たとえば、 re.I | re.M は I フラグと M フラグに設定されます。


I IGNORECASE

は、文字の一致時に大文字と小文字を区別せずに一致させます。たとえば、[A-Z] は小文字とも一致し、スパムは「Spam」、「spam」、または「spAM」と一致します。この小文字は現在の位置を考慮しません。


L LOCALE

は、現在のローカリゼーション設定に応じて、「w、」W、「b、および「B」に影響します。


ロケールは、さまざまな言語を考慮する必要があるプログラミングを支援するために使用される C 言語ライブラリの機能です。たとえば、フランス語のテキストを処理している場合、テキストを「w+」と一致させたいとしますが、「w」は文字クラス [A-Za-z] にのみ一致し、「é」や「?」には一致しません。システムが適切に構成され、ロケールがフランス語に設定されている場合、内部 C 関数はプログラムに「é」も文字と見なすように指示します。正規表現のコンパイル時に LOCALE フラグを使用すると、これらの C 関数を使用して "w" を処理するコンパイル済みオブジェクトが作成されます。これにより速度は遅くなりますが、"w+ を使用してフランス語のテキストと一致させることができます。


M MULTILINE

(^ と $ は現時点では解釈されません。これらはセクション 4.1 で導入されます。)


文字列の先頭のみに一致する場合は「^」を使用し、$ は使用します。文字列の末尾と、改行 (存在する場合) の直前の文字列の末尾のみに一致します。このフラグが指定されている場合、「^」は文字列の先頭と文字列内の各行の先頭に一致します。同様に、$ メタ文字は文字列の末尾と文字列内の各行の末尾 (各改行の直前) に一致します。


S DOTALL

は、「.」特殊文字が改行を含むすべての文字に一致します。このフラグがない場合、「.」は改行を除くすべての文字に一致します。


X 冗長

このフラグにより​​、より柔軟な形式が提供されるため、正規表現の記述が理解しやすくなります。このフラグを指定すると、RE 文字列内の空白は、空白が文字クラス内またはバックスラッシュの後ろにない限り無視されます。これにより、RE をより明確に整理してインデントすることができます。また、RE にコメントを書き込むこともできますが、コメントはエンジンによって無視されます。コメントには「#」記号が付いていますが、この記号を文字列やバックスラッシュの後に置くことはできません。

最後に: 文字列メソッドを使用できる場合は、正規表現を選択しないでください。文字列メソッドの方が簡単で高速であるためです。

Python の re モジュールの正規表現操作に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。