Python正規表現の使用例の詳細

6509 ワード

一つの概念として、正規表現はPythonにとって独自のものではない.しかし、Pythonの正規表現は実際の使用過程でわずかな違いがある.
本文はPythonの正規表現に関する一連の文章の一部である.このシリーズの最初の文章では、Pythonの正規表現をどのように使用するかを重点的に議論し、Pythonの独自の特性を強調します.
Pythonで文字列を検索して検索する方法について説明します.次に、グループを使用して、検索した一致するオブジェクトのサブアイテムを処理する方法について説明します.
私たちが興味を持って使っているPythonの正規表現のモジュールは通常「re」と呼ばれています.

>>> import re


1.Pythonの元のタイプの文字列
Pythonコンパイラは、文字列定数のエスケープ文字を「」(反スラッシュ)で表します.
逆スラッシュの後ろにコンパイラが認識できる特殊文字の列が続くと、エスケープシーケンス全体が対応する特殊文字に置き換えられます(たとえば、''はコンパイラに改行文字に置き換えられます).
しかし、これはPythonでの正規表現の使用に問題をもたらした.なぜなら、「re」モジュールでは、正規表現の特殊な文字(例えば*や+)を変換するために反スラッシュも使用されるからだ.
この2つの方法の混合は、特殊な文字がPythonと正規表現のコンパイラで同時に認識される場合、エスケープ文字自体をエスケープしなければならない場合がありますが、他の場合はそうする必要はありません(特殊な文字がPythonコンパイラでしか認識されない場合).
私たちの考えを理解するのにどれだけの反スラッシュが必要なのかを理解するよりも、元の文字列を使って置き換えることができます.
元のタイプの文字列は、通常の文字列の二重引用符の前に文字「r」を付けることで簡単に作成できます.文字列が元のタイプの場合、Pythonコンパイラは置換を試みません.本質的には、コンパイラに文字列に干渉しないように伝えています.

>>> string = 'This is a
normal string' >>> rawString = r'and this is a
raw string' >>> print string

これは普通の文字列です

>>> print rawString
and this is a
raw string

これは元のタイプの文字列です.Pythonで正規表現で検索
「re」モジュールは、入力された文字列を正確にクエリーする方法をいくつか提供します.私たちが議論する方法は、次のとおりです.

re.match()
re.search()
re.findall()

各メソッドは、正規表現と検索対象の文字列を受信します.この方法をもっと詳しく見て、彼らがどのように働いているのか、彼らがそれぞれ何が違うのかを理解しましょう.
2.reを使用する.match検索�Cマッチング開始
まずmatch()の方法を見てみましょう.match()メソッドの動作は、検索された文字列の先頭マッチングモードの場合にのみマッチングオブジェクトを検索することです.
たとえば、文字列「dog cat dog」に対してmathch()メソッドを呼び出すと、検索モード「dog」が一致します.

>>> re.match(r'dog', 'dog cat dog')
<_sre.sre_match object="" at="">>> match = re.match(r'dog', 'dog cat dog')
>>> match.group(0)
'dog'

group()メソッドについては後述する.今、私たちは0をパラメータとして呼び出し、group()メソッドが検索した一致するモードを返すことを知る必要があります.
戻ってきたSREも一応省略しましたMatchオブジェクトについては、すぐに議論します.
ただし、同じ文字列に対してmath()メソッドを呼び出し、パターン「cat」を検索すると、一致は見つかりません.

>>> re.match(r'cat', 'dog cat dog')
>>>

3.reを使用する.search検索�Cは任意の位置に一致する
search()メソッドはmatch()と似ていますが、search()メソッドは文字列の先頭からのみ一致を検索することを制限しません.したがって、サンプル文字列で「cat」を検索すると一致が見つかります.

search(r'cat', 'dog cat dog')
>>> match.group(0)
'cat'

しかし、search()メソッドは、一致するアイテムを検索した後に検索を停止するため、私たちの例の文字列ではsearc()メソッドで「dog」を検索すると、最初に現れた場所だけが見つかります.

>>> match = re.search(r'dog', 'dog cat dog')
>>> match.group(0)
'dog'

4.reを使用する.findall�Cすべての一致するオブジェクト
これまでPythonで一番多かった検索方法はfindall()です.findall()メソッドを呼び出すと、matchのオブジェクトを得るのではなく、すべてのマッチングモードのリストを非常に簡単に得ることができます(matchオブジェクトについては、後述します).私にとってこれはもっと簡単です.サンプル文字列に対してfindall()メソッドを呼び出すには、次のようにします.

['dog', 'dog']
>>> re.findall(r'cat', 'dog cat dog')
['cat']

5.matchを使用する.startとmatch.endメソッド
では、以前のsearch()メソッドとmatch()メソッドが以前に返してくれた「match」オブジェクトとはいったい何なのでしょうか.
単純な戻り文字列のみのマッチング部分とは異なり、search()とmatch()が返す「マッチングオブジェクト」は、実際にはマッチングサブ列に関するパッケージクラスです.
以前はgroup()メソッドを呼び出して一致するサブストリングを得ることができたのを見ましたが(次のセクションでは、実際に一致するオブジェクトはパケットの問題を処理する際に非常に役立ちます)、一致するオブジェクトには一致するサブストリングに関するより多くの情報が含まれています.
たとえば、matchオブジェクトは、元の文字列の開始位置と終了位置で一致する内容を示すことができます.

>>> match = re.search(r'dog', 'dog cat dog')
>>> match.start()
0
>>> match.end()
3

これらの情報を知ることは、時には非常に役に立つことがあります.
6.mathchを使用する.グループは数値でグループ化されます
前に述べたように、マッチングオブジェクトはパケットを処理するときに非常に適切です.
グループ化は、正規表現全体の特定のサブ列を位置決めする能力です.正規表現全体の一部としてグループを定義し、この部分に一致するコンテンツの位置決めを個別に指定できます.
どのように働いているのか見てみましょう.

>>> contactInfo = 'Doe, John: 555-1212'

私がさっき作成した文字列は、ある人のアドレス帳から取り出したクリップに似ています.この行を一致させるには、このような正規表現を使用します.

>>> re.search(r'\w+, \w+: \S+', contactInfo)
<_sre.sre_match object="" at=""> 
 

正規表現の特定の部分をカッコで囲むことで、コンテンツをグループ化し、これらのサブグループを個別に処理できます.

>>> match = re.search(r'(\w+), (\w+): (\S+)', contactInfo)

これらのパケットは、パケットオブジェクトのgroup()法により得ることができる.正規表現の左から右に表示される数値の順序によって位置を特定できます(1から).

>>> match.group(1)
'Doe'
>>> match.group(2)
'John'
>>> match.group(3)
'555-1212'

グループのシーケンス数が1から始まるのは、0番目のグループがすべてのマッチングオブジェクトを格納するために予約されているためです(match()メソッドとsearch()メソッドを以前に学習したときに見ました).

>>> match.group(0)
'Doe, John: 555-1212'

7.matchを使用する.グループは別名でグループ化されます
特に、正規表現に多くのパケットがある場合、グループの出現順序によって位置決めが現実的ではない場合がある.Pythonでは、次の文でグループ名を指定できます.

>>> match = re.search(r'(?P\w+), (?P\w+): (?P\S+)', contactInfo)

グループの内容はgroup()メソッドで取得できますが、以前に使用したグループのビット数ではなく、指定したグループ名を使用します.

>>> match.group('last')
'Doe'
>>> match.group('first')
'John'
>>> match.group('phone')
'555-1212'

これにより、コードの明確性と可読性が大幅に強化されます.正規表現がますます複雑になると、どのようなコンテンツをキャプチャするかを理解するのがますます難しくなることを想像することができます.あなたのグループに名前を付けると、あなたとあなたの読者のあなたの意図が明確に教えられます.
findall()メソッドはパケットオブジェクトを返さないが、パケットを使用することもできる.同様に、findall()メソッドは、各メタグループのN番目の要素が正規表現のN番目のグループに対応するメタグループのセットを返します.

>>> re.findall(r'(\w+), (\w+): (\S+)', contactInfo)
[('Doe', 'John', '555-1212')]

ただし、パケット名はfindall()メソッドには適用されません.
本稿ではPythonで正規表現を用いたいくつかの基礎を紹介した.元の文字列タイプ(正規表現を使用して頭が痛い問題を解決するのに役立つ)について学びました.また,match(),search(),and findall()メソッドを用いて基本的なクエリーを行う方法,および一致するオブジェクトのサブコンポーネントを処理するためにパケットを使用する方法も学習した.
いつものように、このテーマに関する内容をもっと見たいなら、reモジュールのPython公式ドキュメントは非常に良いリソースです.
今後の記事では,Pythonにおける正規表現の応用についてさらに深く議論する.マッチングオブジェクトをより包括的に学習し、文字列に置き換える方法を学習し、テキストファイルからPythonデータ構造を解析する方法も学習します.