あなたが知らないPython正規表現の7つの使用例

6338 ワード

一つの概念として、正規表現はPythonにとって独自のものではない.しかし、Pythonの正規表現は実際の使用過程でわずかな違いがある.
Pythonで文字列を検索して検索する方法について説明し、私たちが検索した一致するオブジェクトのサブアイテムを処理するためにパケットを使用する方法について説明します.
使用するPythonの正規表現のモジュールは、通常「re」と呼ばれます.
>>> import re
  • 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()

    各メソッドは、正規表現と検索対象の文字列を受信します.この方法をもっと詳しく見て、彼らがどのように働いているのか、彼らがそれぞれ何が違うのかを理解しましょう.
  • re.matchを使用して検索–一致開始
  • まず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') 
      
  • re.searchを使用して検索–任意の場所に一致する
  • 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'

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

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

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

    match.start()
    match.end()


    これらの情報を知ることは、時には非常に役に立つことがあります.
  • mathch.groupを使用してデジタルパケット
  • を通過
    前に述べたように、マッチングオブジェクトはパケットを処理するときに非常に適切です.
    グループ化は、正規表現全体の特定のサブ列を位置決めする能力です.正規表現全体の一部としてグループを定義し、この部分に一致するコンテンツの位置決めを個別に指定できます.
    どのように働いているのか見てみましょう.
    >>> 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'
  • match.groupを使用して別名で
  • をグループ化
    特に、正規表現に多くのパケットがある場合、グループの出現順序によって位置決めが現実的ではない場合がある.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()メソッドには適用されません.
    本稿では、Pythonで正規表現を使用するいくつかの基礎を紹介し、元の文字列タイプを学習しました(正規表現を使用する上で頭が痛い問題を解決することができます).match(),search(),and findall()メソッドを使用して基本的なクエリーを行う方法,および一致するオブジェクトのサブコンポーネントを処理するためにパケットを使用する方法も学習した.
    いつものように、このテーマに関する内容をもっと見たいなら、reモジュールのPython公式ドキュメントは非常に良いリソースです.