ホームページ  >  記事  >  バックエンド開発  >  Python 正規表現操作の詳細ガイド

Python 正規表現操作の詳細ガイド

巴扎黑
巴扎黑オリジナル
2017-05-21 11:16:381665ブラウズ

Python はバージョン 1.5 以降、Perl スタイルの正規表現パターンを提供する re モジュールを追加しました。 Python 1.5 より前のバージョンでは、regex モジュールを通じて Emecs スタイルのパターンが提供されていました。 Emacs スタイル モードは、可読性と機能が若干劣るため、新しいコードを作成するときは regex モジュールを使用しないようにしてください。 もちろん、古いコードにその痕跡が残っている場合があります。

その性質上、正規表現 (または RE) は、Python に組み込まれ、re モジュールを通じて実装される、小さくて高度に特殊化されたプログラミング言語です。この小さな言語を使用すると、一致させたい対応する文字列セットのルールを指定できます。その文字列セットには、英語の文章、電子メール アドレス、TeX コマンドなど、必要なものがすべて含まれます。次に、「この文字列はパターンと一致しますか?」または「この文字列の一部はパターンと一致しますか?」などと尋ねることができます。 RE を使用して、さまざまな方法で文字列を変更または分割することもできます。


正規表現パターンは一連のバイトコードにコンパイルされ、C で書かれたマッチング エンジンによって実行されます。高度な使用法では、エンジンが特定の RE をどのように実行するか、生成されたバイトコードをより高速に実行するために RE が特定の方法でどのように記述されるかに細心の注意を払うことも必要になる場合があります。最適化にはマッチング エンジンの内部メカニズムを完全に理解する必要があるため、この記事では最適化については説明しません。


正規表現言語は比較的小さく制限されている (機能が制限されている) ため、すべての文字列処理を正規表現で実行できるわけではありません。もちろん、正規表現を使用して実行できるタスクもありますが、最終的には式が非常に複雑になります。このような状況に遭遇した場合は、それに対処する Python コードを作成した方がよい場合があります。ただし、Python コードは複雑な正規表現よりも処理が遅くなりますが、理解しやすいです。

シンプルモード

最も単純な正規表現の学習から始めます。正規表現は文字列の操作によく使用されるため、最も一般的なタスクである文字の一致から始めましょう。


正規表現 (決定論的および非決定論的有限オートマトン) の基礎となるコンピュータ サイエンスの詳細な説明については、コンパイラの作成に関する教科書を参照してください。

文字のマッチング

ほとんどの文字や文字は通常、それ自体と一致します。たとえば、正規表現 test は文字列「test」と完全に一致します。 (大文字と小文字を区別しないモードを使用することもできます。これにより、この RE は「Test」または「TEST」と一致します。これについては後で説明します。)

もちろん、このルールには例外があり、特殊な文字はそうではありません。それ自体は一致しますが、何か特別なものと一致する必要があること、または RE の他の部分の繰り返し回数に影響を与えることを示します。この記事の大部分は、さまざまなメタキャラクターとその機能について説明することに当てられています。

メタキャラクターの完全なリストは次のとおりです。その意味については、このガイドの残りの部分で説明します。

。最初に検査するメタキャラクターは次のとおりです。 "[" そして "]"。これらは、一致させる文字セットである文字カテゴリを指定するためによく使用されます。文字は個別にリストすることも、「-」記号で区切られた 2 つの指定された文字を使用して文字範囲を表すこともできます。たとえば、[abc] は「a」、「b」、「c」のいずれかの文字に一致します。また、[a-c] の間隔を使用して同じ文字セットを表すこともでき、前者と同じ効果があります。小文字のみを一致させたい場合は、RE を [a-z] として記述する必要があります。メタ文字はカテゴリでは機能しません。たとえば、[akm$] は文字「a」、「k」、「m」、または「$」のいずれかと一致します。「$」は通常メタ文字として使用されますが、文字クラス内ではその特性は削除されます。 , 通常の文字に戻します。 補数を使用して、範囲にない文字と一致させることができます。この方法では、カテゴリの最初の文字として「^」を使用します。他の場所の「^」は単に「^」文字自体と一致します。たとえば、[^5] は「5」を除く任意の文字に一致します。

おそらく最も重要なメタ文字はバックスラッシュ """ です。Python の文字列として、バックスラッシュの後に別の文字を追加して、さまざまな特別な意味を表現できます。また、すべてのメタ文字をキャンセルするために使用することもできます。この方法でメタ文字を一致させることができます。たとえば、パターン内で文字「[」または「"」を一致させる必要がある場合は、その前にバックスラッシュを付けて、その特別な意味を削除できます:「[」または「"」。 """ で始まる文字は、通常、数値セット、アルファベット セット、またはその他の空でない文字セットなどに役立ちます。使用可能なプリセット特殊文字は次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって作成されたコード強調表示

d 任意の 10 進数と一致します。クラス[0-9]へ。

D は、クラス [^0-9] と同等の数値以外の文字に一致します。

は、クラス ["t"n"r" )と同等です。 v]。

S は、空白文字以外の文字と一致します。これは、クラス [^"t"n"r") と同等です。 f " v]。

w は任意の英数字に一致します。クラス [a-zA-Z0-9_] と同等です。

W は、英数字以外の文字と一致します。クラス [^a-zA-Z0-9_] と同等です。 このようにして、特殊文字を文字クラスに含めることができます。たとえば、["s,.] 文字クラスは、任意の空白文字、「,」、または「.」と一致します。

このセクションの最後のメタ文字は . です。代替パターンの改行文字を除く任意の文字と一致します ( re .DOTALL) 改行にも一致します。「.」は通常、「任意の文字」と一致させたい場合に使用されます

繰り返し

正規表現でできることは、可変長の文字セットと一致することです。これは、文字列を処理する他のメソッドでは実行できないことですが、それが正規表現の唯一の追加機能である場合は、正規表現の一部の繰り返しの数を指定できることになります。

先ほど説明した繰り返し関数の最初のメタキャラクターは * です。* はアルファベット文字「*」とは一致しません。代わりに、前の文字が 1 回だけではなく複数回一致することを指定します。

たとえば。 、ca*t は、「ct」(「a」文字 0 個)、「cat」(「a」文字 1 個)、「caaat」(「a」文字 3 個)などと一致します。RE エンジンにはさまざまな内部機能があります。 C の整数型のサイズには、2 億を超える「a」文字との一致を防ぐための制限があり、そのような大きな文字列を構築するには十分なメモリがない可能性があるため、

のような繰り返しはその制限まで蓄積されません。 * は「貪欲」です。RE を繰り返す場合、マッチング エンジンはパターンの後半部分が一致しない場合は、戻って繰り返しを繰り返します。

ステップバイステップの例で、「b」で終わる 0 個以上の文字「bcd」と一致する式 a[bcd]*b について考えてみましょう。この RE と文字列「abcbd」の一致。

ステップ マッチング 説明
1 a aマッチングモード
2 abcbd エンジンマッチング[bcd]* 、文字列と一致するように最善を尽くします。エンジンは b と照合しようとしますが、現在の位置はすでに文字の末尾にあるため、失敗します
4 abcb を返し、 [bcd]* は 1 つ少ない文字と照合しようとします。
5 失敗 bをもう一度試してみますが、最後の文字は「d」になります。
6 abc 再度返されると、[bcd]* は「bc」のみに一致します。
7 abcb もう一度 b を試してください、今度は現在の位置の文字は正確に「b」です

RE の終わりが到達可能になり、「abcb」と一致します。これは、マッチング エンジンが最初にできる限り一致を試み、一致しない場合はステップバックして RE の残りの部分を繰り返し試行することを示しています。 [bcd] の照合を 0 回試行して失敗するまで、エンジンは文字列が RE にまったく照合できないと想定します。


もう 1 つの繰り返しメタ文字は + で、これは 1 回以上一致することを意味します。 * と + の違いに注意してください。* は 0 回以上一致するため、まったく出現する必要はありませんが、+ は少なくとも 1 回出現する必要があります。同じ例を使用すると、ca+t は「cat」 (1 "a")、「caaat」 (3 "a") には一致しますが、「ct」には一致しません。


他にもたくさんの資格があります。疑問符 ? は 1 回または 0 回一致します。これは、何かがオプションであることを示すために使用されると考えることができます。たとえば、home-?brew は「homebrew」または「home-brew」と一致します。


最も複雑な繰り返し修飾子は {m,n} です。ここで、m と n は 10 進整数です。この修飾子は、少なくとも m 回、最大で n 回の繰り返しがあることを意味します。たとえば、a/{1,3}b は、「a/b」、「a//b」、および「a///b」に一致します。スラッシュがないため「ab」には一致できません。スラッシュが 4 つあるため「a////b」にも一致しません。


m または n は省略できます。欠損値には適切な値が想定されます。 m を無視すると下限は 0 になりますが、n を無視すると上限は無限大になります。実際には先ほど述べた 2 兆ですが、おそらく無限大と同じです。


注意深い読者は、他の 3 つの修飾子がこの方法で表現できることに気づくかもしれません。 {0,} は * に相当し、{1,} は + に相当し、{0,1} は ? に相当します。可能であれば、*、+、または ? を使用することをお勧めします。単に短くて理解しやすいからです。

正規表現の使用

簡単な正規表現をいくつか見てきましたが、実際に Python でそれらをどのように使用するのでしょうか? re モジュールは、RE をオブジェクトにコンパイルし、それらを照合に使用できるようにする正規表現エンジンへのインターフェイスを提供します。

正規表現のコンパイル

正規表現は `RegexObject` インスタンスにコンパイルされ、パターン マッチング検索や文字列置換などのさまざまな操作のメソッドを提供できます。 actiPro codehighlight によるコードハイライト製品 (フリーウェア)

http://www.codeHighlyhter.com/

# 私は無視します)

RE は文字列として re.compile() に送信されます。正規表現は Python 言語の中核部分ではなく、正規表現用の特定の構文が作成されていないため、RE は文字列として処理されます。 (アプリケーションは単純に RE を必要としないため、RE を含めることで言語仕様を肥大化する必要はありません。) re モジュールは、socket モジュールや zlib モジュールと同様に、C 拡張モジュールとして Python に組み込まれるだけです。


Python 言語の単純さを確保するために文字列として RE を使用しますが、これは次のセクションのタイトルで述べたような問題を引き起こします。

バックスラッシュの問題

以前の規制では、正規表現はバックスラッシュ文字 (""") を使用して、特殊な形式を表したり、特殊な使用法を呼び出すことなく特殊文字の使用を許可したりしていました。これは、Python での同一の文字の使用に似ています。文字列内で同じ効果を持つ文字があると競合が発生します


たとえば、おそらく LATEX ファイル内の文字列 ""section" に一致する RE を書きたいとします。プログラムコードで判定するには、まず照合したい文字列を書きます。次に、すべてのバックスラッシュとメタキャラクターの前にバックスラッシュを付けて、特別な意味を削除する必要があります。

Character stage
section 一致する文字列
\section re.compileのバックスラッシュの特別な意味をキャンセルします
"\\sセクション」 キャンセル文字列のバックスラッシュ


簡単に言えば、バックスラッシュと一致させるには、RE文字列に「\」を記述する必要があります。正規表現には「\」が必要であり、すべてのバックスラッシュは次のように表現される必要があるためです。 「\」は、Python の文字列表現の規則に従っています。 RE 内のバックスラッシュのこの繰り返しの性質により、多数のバックスラッシュが繰り返され、結果の文字列を理解することが困難になります。


解決策は、正規表現に Python の生の文字列表現を使用することです。文字列の前に「r」バックスラッシュを追加すると、特別な方法で処理されなくなります。そのため、r"n" には "" が含まれ、"n" は 2 文字になります。一方、「n」は改行を示す 1 文字です。正規表現は通常、Python コードではこの生の文字列によって表されます。

通常の文字列 生の文字列
"ab*" r"ab*"
"\\section" r"\section"
"\ \ s+\1" r"w+s+1"

照合を実行します

コンパイルされた正規表現オブジェクトを取得したら、それをどうしますか? `RegexObject` インスタンスにはいくつかのメソッドとプロパティがあります。ここには最も重要なものだけが表示されています。完全なリストを確認したい場合は、Python ライブラリ リファレンスを参照してください。 位置一致

search()この RE が一致する位置を見つけるために文字列をスキャンします。 findall() RE に一致するすべての部分文字列を検索し、リストとして返しますfinditer () RE に一致するすべての部分文字列を検索し、反復子として返します


一致するものが見つからない場合、match() と search() は None を返します。成功すると、一致の開始位置と終了位置、一致した部分文字列などの一致に関する情報を含む `MatchObject` インスタンスが返されます。

人間と機械の対話を使用し、re モジュールを実験することでそれを学ぶことができます。 Tkinter をお持ちの場合は、Python ディストリビューションに含まれるデモ プログラムである Tools/scripts/redemo.py を検討してみてください。

まず、Python インタープリターを実行し、re モジュールをインポートし、RE をコンパイルします:

# !python

Python
2.2.2 (#1、2003年2月10日、12:57:01)

>> ; > インポート
>>
)>> + は「1 回以上の繰り返し」を意味するため、空の文字列はまったく一致しません。 この場合、インタープリタに出力がないため、match() は None を返します。これは、match() の結果を明示的に出力することで確認できます。 actiPro codehighlight によるコード ハイライト製品 (フリーウェア) http://www.codeHighlyhter.com/ #! Python & gt; & gt; (
""
)
>>>
print p.match(""

)

なし

#!python

>>> m.group()

'テンポ'

> ; >> m.start( )、m.end()

(0、
5

>>> () RE に一致する部分文字列を返します。 start() と end() は、一致が開始および終了するインデックスを返します。 scan() は、開始インデックスと終了インデックスを 1 つのタプルにまとめて返します。なぜなら、match メソッドは、RE が文字列の先頭から一致を開始する場合、start() が常に 0 になることをチェックするからです。ただし、「RegexObject」インスタンスの検索メソッドは次の文字列をスキャンします。この場合、一致は 0 以外の位置から始まる可能性があります。 actipro codehighlight(フリーウェア)による製品http://www.codehighlyhter.com p.search(
'
::: message

>>

m.group()#!python

p
= re.compile( )

m
= p.match('文字列がここにあります')

ifm:

print 'マッチ見つかりました: '、m.group()

else:

print'一致しません'
2 つの `RegexObject` メソッドはすべての一致を返しますパターンの部分文字列。 findall() は一致する文字列行のリストを返します:


#!python

>>>
p = re.compile() ' "d+')

>>>
p.findall('12人のドラマーがドラムを叩き、11人の笛吹き手が笛を吹き、10人の領主が跳躍 ' ) [

'
12''11''10'findall() は、 result リストを作成しないでください。Python 2.2 では、 finditer() メソッド

を使用することもできます。actiPro CodeHighlight によるコード ハイライト製品 (フリーウェア)

http://www.codeHighlyhter.com/ #!python

ref
= re.compile()

entityref
= re.compile()

charref
= re.compile( )

starttagopen
= re.compile( )

私は通常、たとえ一度しか使用されないとしてもコンパイルオブジェクトを使用することを好みますが、これについて私ほど純粋主義者はほとんどいないでしょう。 。

コンパイル フラグ

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


ここに、使用可能なフラグの表と各フラグの詳細な説明を示します。

DOTALL、Sは改行を含むすべての文字と一致しますIは大文字と小文字を区別しない一致を行いますLOCALE、Lはしますロケールを意識したマッチングMULTILINE、M複数行のマッチング、^ と $VERBOSE、Xは RE の冗長状態を使用して整理することができます。 より明確で理解しやすくなります

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
VERBOSE

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

たとえば、これは re.VERBOSE を使用した RE です。どれだけ読みやすくなるかわかりますか?


#!python
charref
=re。コンプile (r"""
&[[]]] # 数値実体参照の開始

(

[0-9]+[^0-9] ,

!python





charref
= re.compile(
"

( [0-9]+[^0-9]
")
」 |0[0-7]+[^0-7]
"" |x[0-9a-fA-F]+[^0-9a-fA-F]) "
)
上記の例では、Python の文字列自動連結を使用して RE を小さいセクションに分割できますが、re.VERBOSE フラグを使用する場合よりも理解しにくくなっています。 その他のパタ​​ーンの機能 これまで、正規表現の機能の一部のみを示してきました。このセクションでは、いくつかの新しいメタキャラクターと、グループを使用してテキストの一致する部分を取得する方法を説明します。

その他のメタキャラクター

まだ紹介していないメタキャラクターがいくつかありますが、そのほとんどがこのセクションで紹介されます。


議論すべき残りのメタキャラクターは、ゼロ幅アサーションです。これらは文字列の処理時にエンジンを高速化するものではなく、文字にまったく対応せず、単純な成功または失敗にのみ対応します。たとえば、「b」は、現在の位置を単語境界に配置するアサーションであり、その位置は「b」によってまったく変更されません。これは、ゼロ幅アサーションが繰り返されないことを意味します。特定の位置で 1 回一致した場合は、明らかに無限に一致する可能性があるためです。

|


オプションの「または」演算子。 A と B が正規表現の場合、A|B は「A」または「B」に一致する任意の文字列に一致します。 | は優先度が非常に低いため、複数の文字列を選択する場合に適切に動作します。 Crow|Servo は、「Crow」または「Servo」と一致しますが、「Cro」、「w」または「S」、および「ervo」とは一致しません。


文字「|」に一致するには、「|」を使用するか、[|] などの文字クラスに含めることができます。

^


は行の先頭に一致します。MULTILINE フラグが設定されていない限り、 MULTILINE モードでは、文字列の先頭のすべての改行を直接一致させることもできます。たとえば、行の先頭にある単語「From」のみを一致させます。 RE は ^From を使用します。

Actipro CodeHighlighter (フリーウェア) によって作成されたコード ハイライト
http://www.CodeHighlighter.com/

-->#!python>>> p
=
re.compile(' (ab)* '

)

> (0,

10

)

グループは「(」と「)」で指定され、一致するテキストの開始インデックスと終了インデックスを取得します。これは、単一の引数を介して group()、start()、end()、span() で取得できます。グループは 0 からカウントされます。グループ 0 は常に存在し、RE 全体であるため、「MatchObject」のメソッドはすべてグループ 0 をデフォルトの引数として受け取ります。後で、一致するテキストを取得できないスパンを表現する方法を見ていきます。 actiPro CodeHighlight によるコード ハイライト製品 (フリーウェア)

http://www.codeHighlyhter.com/

#

!python


# !python

>>> p = re.compile(r'(?P ')

>>> m = p.search('(((( 句読点が多い ))) ' )

>>> ; m.group(1)'

たくさん
' 名前付きグループは、次のことを可能にするため便利です。ライブ番号を覚えておく必要はなく、覚えやすい名前を使用することができます。imaplib モジュールの RE の例を次に示します。 .com/ -->#

!python
InternalDate =

re.compile(r
'INTERNALDATE "')

r

#! python

>>>> >もう 1 つのゼロ幅アサーションは前方デリミタには、以下に示すように、前方正の区切り文字と後方正の区切り文字: (?=...)
前方正の区切り文字... で表される正規表現が現在の位置で正常に一致する場合、成功します。それ以外の場合は、含まれている式が試行されると失敗し、パターンの残りの部分も区切り文字の右側を試行します
(?!...) 正の区切り文字; 含まれる式が文字列の現在位置と一致する場合に成功しない場合 ファイル名と一致し、それをベース名とファイル名に分割する単純なパターンを検討してください。たとえば、「news.rc」では、「news」がベース名で、「rc」がファイル拡張子です。 コードの強調表示は非常に簡単です。 Actipro CodeHighlighter (フリーウェア) によって作成されました http://www.CodeHighlighter.com/

-->
.*[.].*

$

「.」が必要であることに注意してください。これはメタ文字であるため、特別な扱いをします。また、文字列の残りすべてが拡張子に含まれるようにするために、最後に追加された $; にも注意してください。この正規表現は

Actipro CodeHighlighter (フリーウェア) によって作成されたコード ハイライト

http://www.CodeHighlighter.com/ -->

"

foo.bar


"


" と一致します。

.*[.][^b].* $

上記の「bat」を削除する最初の試みでは、拡張子の最初の文字が「b」ではないことが必要です。パターンは「foo.bar」にも一致しないため、これは間違っています。

.*[.]([^b].. |.[^a].|..[^t])$

次の状況に一致する必要がある最初の回避策にパッチを適用しようとすると、拡張子の最初の文字は「b」ではなく、2 番目の文字は「a」ではなく、3 番目の文字は「t」ではありません。これにより、「foo.bar」は受け入れられますが、「autoexec.bat」は拒否されますが、必要なのは 3 文字の拡張子のみで、「sendmail.cf」などの 2 文字の拡張子は受け入れられません。パッチを適用する作業をしながら、パターンを再び複雑にしていきます。

.*[.]([^b].? .?|.[^a]?.?|..?[^t]?)3回目、2回目、そして「sendmail.cf」など、3 文字未満の拡張子の一致を許可するために、3 番目の文字はオプションになりました。

パターンが非常に複雑になっているため、読みにくくなっています。さらに悪いことに、問題が変わり、「bat」と「exe」以外の拡張子が必要になると、パターンはさらに複雑で混乱することになります。


前方否定により、これらすべてが次のように削減されます:


Actipro CodeHighlighter (フリーウェア) によって作成されたコードの強調表示

http://www.CodeHighlighter.com/
.

*[. ](?!bat$).*$前の意味: ここで式 Bat が一致しない場合は、パターンの残りの部分を試し、bat$ が一致した場合、パターン全体が失敗します。末尾の $ は、「sample.batch」などの「bat」で始まる拡張子が許可されるようにするために必要です。

別のファイル拡張子を区切り文字でオプションにするだけで簡単に除外できるようになりました。以下のパターンでは、「bat」または「exe」で終わるファイル名が除外されます。

.*[.](?!bat$|exe$ ).*$

文字列を変更する

これまでは、単に静的な文字列を検索してきました。正規表現は通常、以下の `RegexObject` メソッドを通じて文字列を変更するさまざまな方法でも使用されます。

フラグ の意味
メソッド/プロパティ 関数
split() REが一致する文字列を分割してリストを生成、
sub() RE文字列と一致するすべてのsubを見つけて置換します別の文字列を使用します
subn() sub() と同じですが、新しい文字列と置換の数を返します

文字列を分割する

`RegexObject`のsplit()メソッドは、REが一致する文字列を分割し、リストを返します。これは string split() メソッドに似ていますが、より多くの区切り文字を提供します。split() は空白文字と固定文字列のみをサポートします。ご想像のとおり、モジュールレベルの re.split() 関数もあります。

split(string [, maxsplit = 0])

正規表現による文字列をいくつかに分割します。 RE でキャプチャ ブラケットが使用されている場合、その内容も結果リストの一部として返されます。 maxsplit がゼロ以外の場合、最大でも maxsplit シャードまで分割できます。


maxsplit 値を設定することで、分割数を制限できます。 maxsplit がゼロ以外の場合、最大でも maxsplit 分割が可能であり、文字列の残りの部分がリストの最後の部分として返されます。次の例では、区切り文字には英数字以外の任意の文字列を使用できます。

#!python

>>> p = re.compile(r'"W+')

>>> p.split(') これはテストです、短くて甘い、split().')

[
'This','', 'テスト短い甘い , 'of', '分割', ]

>&g t;> p.split( 'これは、split() の短くて楽しいテストです。', 3)

[
'This', ' is', 'a', 'テスト、短くて素敵な、split().']

有時、你不仅对キャプチャーブロック番号が RE で使用される場合、それらの値もリストの一部として返される可能性があります。

#!python

>>> p = re.compile(r'"W+')

>>> p2 = re .compile(r' ("W+)')

>>> p.split('これはテストです。')

[
] 「これ, , a, テスト]

>>> p2.split('これ は テストです。')

[
' これ' , ' ', '', ' ', 'a' , テスト, ., ]

模块级函数 re.split () RE を最初のパラメータとして扱います。

#!python

>>> re.split('["W]+', '言葉、言葉、言葉。')

[
'言葉' , '言葉', '言葉', ]

>& gt;> re.split( '(["W]+)', '言葉、言葉、言葉。')

[
'言葉', ', '単語', ', ', ' 言葉.', '']

>>> re.split('["W]+' '言葉、言葉、言葉。', 1)

[
'言葉', '言葉、言葉。' ]

検索と置換

その他の一般的な用途は、すべてのモードに適合する文字列を検出し、異なる文字列で置換することです。sub() メソッドは、文字列または関数、または 1 つの代替値を提供します。


sub(replacement, string[, count =) 0])

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


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


これは、sub() メソッドを使用した簡単な例です。色の名前を「色」という単語に置き換えます。 actiPro CodeHighlight によるコード ハイライト製品 (フリーウェア)

http://www.codeHighlyhter.com/

#!python

>>>s ='< t;タイトル '

>>>レン

32

>>> print re.match( '<.*>', s).span()
(0,
32)

>>>
print れ.match('<.*>', s).group()

<
html><>< title>Titletitle>
REは「<span style="font-family:新宋体"><」と一致します<" in html></p>"、.* は部分文字列の残りの部分を消費します。ただし、RE にはさらに多くの文字列を残しておきますが、> は文字列の末尾で一致しないため、正規表現は > に一致するものが見つかるまで 1 文字ずつバックトラックする必要があります。最終的な一致は「」になりますが、これは希望どおりではありません。

<span style="font-family:新宋体"><html></span>

この場合、解決策は、貪欲でない修飾子 *?、+?、?? または {m,n}? を使用して、できるだけ小さいテキストに一致するようにすることです。上の例では、最初の「<」の直後に「>」が試行され、失敗すると、エンジンは一度に 1 文字ずつインクリメントし、各ステップで「>」を再試行します。この処理では正しい結果が得られます:


Actipro CodeHighlighter (フリーウェア) によって生成されたコード強調表示
#
!python

>>>
print re.match('<.> html>

正規表現を使用した HTML または XML の解析は面倒であることに注意してください。バリアント カオス パターンは一般的なケースを処理しますが、HTML と XML は特殊なケースであり、考えられるすべてのケースを処理する正規表現を作成すると、正規表現パターンが非常に複雑になります。このようなタスクには HTML または XML パーサーを使用します。

No re.VERBOSE

さて、正規表現表現は非常にコンパクトですが、非常に読みにくいことに気づいたかもしれません。適度に複雑な RE は、バックスラッシュ、括弧、メタ文字の長い集合になり、読みにくくなる可能性があります。


これらの RE では、正規表現のコンパイル時に re.VERBOSE フラグを指定すると、正規表現の形式を編集して明確にすることができるため便利です。


re.VERBOSEロゴにはいくつかの機能があります。文字クラスにない正規表現内の空白文字は無視されます。これは、dog | cat のような式は読みにくい Dog|cat と同じですが、[a b] は文字「a」、「b」、またはスペースと一致することを意味します。あるいは、RE にコメントを入れることもできます。コメントは「#」から次の行に続きます。三重引用符で囲まれた文字列を使用すると、RE をよりきれいにフォーマットできます:

#!python

パット
= re.compile(r"""

"s* header>[^:]+) #ヘッダー名

"s* : # 空白とコロン

(?P.*?) # ヘッダーの値 -- *?

# 以降の末尾の空白が失われます

"s*$ 行末までの空白



「」「
」 、re.VERBOSE)これは非常に読みにくいです:

Actipro CodeHighlighter (フリーウェア) によって作成されたコードの強調表示
#
! python
pat
=
re.compile(r""s*( ?P <ヘッダー& gt;[^ :]+)"s*:(?P.*?)" s *$") フィードバック

正規表現は複雑な主題です。この記事は理解に役立ちますか?それらの部分が不明瞭ですか、それともここでは問題が見つかりませんか?その場合は、改善のための提案を作成者に送信してください。

正規表現について説明した最も包括的な本は、Jeffrey Friedl 著、O'Reilly 出版の『Mastering Regular Expressions』です。残念ながら、この本は Perl と Java スタイルの正規表現のみに焦点を当てており、Python に関する内容は含まれていないため、Python プログラミングのリファレンスとしては十分ではありません。 (最初のバージョンには、Python の現在では廃止された正規表現モジュールが含まれていましたが、これは当然ほとんど役に立ちませんでした)。

以上がPython 正規表現操作の詳細ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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