正規表現


文字クラス[]


[abc]

  • []テキストと一致するかどうかを確認します.

  • 「a」は正規表現と一致します.「a」があるからです.

  • 「before」は、「b」という文字があるため、通常の式と一致します.

  • 正規表現に一致するアルファベットa、b、cが含まれていないため、dudeは一致しません.

  • ハイフネーションはFrom-toと表すことができます
    ex)[a-c]=[abc],[a-zA-Z]=すべてのアルファベット,[0-5]=[012345]

  • []で^を使用すると、逆(not)になります.
    ex)[^0-9]=数値以外の文字
  • 共通文字クラス


  • d:[0-9]と同じ式、数字

  • D:[^0-9]の式、非数値

  • s:スペース文字と組み合わせて、スペースを表します.

  • S:スペース以外の文字と組み合わせて、つまり空白ではありません.

  • w:アルファベット、数字、式は[a-zA-Z 0-9]と同じ

  • W:アルファベット、数字、非、式は[^a-zA-Z 0-9]と同じ
  • Dot(.)


    a.b

  • 改行記号(n)以外のすべての文字と組み合わせます.

  • 「abc」は中間の「a」がすべてを表す「a」である.正規式と一致する.

  • 「a 0 b」は、中間文字「0」がすべての文字を表す「.」正規式と一致する.

  • 「abc」と「a」と「b」の間に文字が必要なこの正規表現は一致しないため、一致しません.
  • 繰り返し(*)


    ca*t

  • は、前の文字を0回以上繰り返す式です.

  • 「ct」は「a」を0回繰り返すことで組み合わせる.(0回含む)

  • 「cat」は「a」を1回繰り返すことで組み合わせたものです.

  • 「caaat」は「a」を3回繰り返すことで組み合わせる.
  • 繰り返し(+)


    ca+t

  • は、前の文字が1回以上繰り返される式です.

  • 「ct」は「a」を0回繰り返すため、コーディネートしません.(と*の違い)

  • 「cat」は「a」を1回繰り返すことで組み合わせたものです.

  • 「caaat」は「a」を3回繰り返すことで組み合わせる.
  • 繰り返し{m,n}


    ca{2}t

  • 前の字を探すのは2回しか繰り返さない.

  • 「cat」の「a」は一度だけ繰り返して、組み合わせません.

  • 「caat」は「a」から2回繰り返して組み合わせる.
  • ca{2,5}t

  • 検索前の文字を2~5回繰り返します.

  • 「cat」の「a」は一度だけ繰り返して、組み合わせません.

  • 「caat」は「a」から2回繰り返して組み合わせる.

  • 「caaaat」は「a」を5回繰り返し組み合わせたものです.
  • 繰り返し(?)


    ab?c

  • ?検索前の文字は0回または1回繰り返します.

  • 「abc」は「b」で組み合わせたものです.

  • 「ac」は0回「b」で組み合わせる.
  • 正規表現

  • 正規表現をサポートするreモジュールをインポートする必要があります.
  • import re
    p = re.compile('ab*')
    m = p.match('python')
    print(m)

  • モードオブジェクト(p)を作成し、他の文字列と比較できます.

  • モードオブジェクトを使用するには、Match、Search、Finall、Finitterの4つの方法があります.
  • Match


  • 文字列の先頭が正規表現と一致するかどうかを確認します.

  • matchオブジェクトには4つの方法(group,start,end,span)がある.
  • グループ():一致する文字列を返します.
  • start():一致する文字列の開始位置を返します.
  • end():一致する文字列の終了位置を返します.
  • span():一致する文字列に対応する(開始、終了)tupleを返します.
  • ✔mというmatchオブジェクトを生成します.
    import re
    p = re.compile('[a-z]+')  # 소문자가 1번이상 반복되는지
    
    m = p.match('python3')
    print(m)  # 매치된다
    
    m = p.match('3python')
    print(m)  # 매치되지 않는다

    ✔matchオブジェクトの4つの方法
    import re
    p = re.compile('[a-z]+')
    m = p.match('python')
    print(m.group())
    print(m.start())
    print(m.end())
    print(m.span())

    Search


    すべての
  • 文字列を検索し、正規表現と一致するかどうかを調べます.
  • ✔mという検索対象を生成します.
    import re
    p = re.compile('[a-z]+')
    m = p.search('3python')
    print(m)

    findall

  • 正規式に一致するすべての文字列がリストに返されます.
  • ✔mというfindallオブジェクトを生成します.
    import re
    p = re.compile('[a-z]+')
    m = p.findall('life is too short')
    print(m)

    finditer

  • 正規表現に一致するすべての文字列を、重複可能な一致オブジェクトとして1つの重複可能なオブジェクトに返します.
  • 「✔m」という名前のfiniterオブジェクトを生成します.
    m = p.finditer('life is too short')
    print(m)
    for x in m:
        print(x)

    コンパイルオプション


  • 正規表現をコンパイルする場合は、次のオプションを使用します.

  • DOTALL, S : . この改行記号(n)を含めて、すべての文字と組み合わせることができます.

  • IGNORECASE,I:大文字と小文字を問わずコーディネートできます.

  • MULTILINE,M:複数の線と組み合わせることができます.

  • VERBOSE、X:verboseモードの使用を許可します.(正規表現の表示が容易になり、コメントなども使用できます.)(長い正規表現を使い分ける.)
  • 普通re.DOTALLオプションは、通常、複数行の文字列でnを検索するために使用されます.
    import re
    p = re.compile('a.b' , re.DOTALL)
    m = p.match('a\nb')
    print(m)

    ✔[a-z]+正規表現は小文字のみを表すが、re.Iオプション、大文字と小文字を区別せずに組み合わせます.
    p = re.compile('[a-z]+')
    m = p.match('Python')
    print(m)
    
    p = re.compile('[a-z]+', re.I)
    m = p.match('Python')
    print(m)

    ✔^は文字列の先頭、$は文字列の末尾を表します.
    import re
    p = re.compile('^python\s\w+')
    
    data = """python one
    life is too short
    python two
    you need python
    python three"""
    
    print(p.findall(data))

    ✔MULTILINE実習-^abは文字列の先頭を常にabで、xy$は文字列の末尾を常にxyで結ぶ必要があります.
    import re
    p = re.compile('^python\s\w+', re.M)
    
    data = """python one
    life is too short
    python two
    you need python
    python three"""
    
    print(p.findall(data))

    ✔VERBOSE実習
    import re
    charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')
    
    charref = re.compile(r"""
     &[#]                # Start of a numeric entity reference
     (
         0[0-7]+         # Octal form
       | [0-9]+          # Decimal form
       | x[0-9a-fA-F]+   # Hexadecimal form
     )
     ;                   # Trailing semicolon
    """, re.VERBOSE)

    スラッシュ問題


  • 正規表現におけるr""の意味

  • 多くの場合、正規モードの前にrを加える.Python正規表現にはRaw stringという構文があり、コンパイルする正規表現がRaw String(純文字)であることを示すことができます.

  • p=reの場合.compile("section")と書くと、sはスペース文字を表す[tnrfv]となり、所望の結果が見つからない.

  • そのため、このエスケープを利用してsectionと呼べば良いのですが、Pythonでrを特殊に使うと、1つのスラッシュだけで2つ書く効果があります.