python正規表現の使い方(抜粋)

7664 ワード

説明
主に抜粋して、どこで見た原文か忘れてしまいました.原作者は私を殴らないでください.もしあなたが私に会ったら、私に連絡して、あなたの著作権とリンクの説明を増やしてください.
インテグラルプロセス
  • Pythonは、reモジュールを介して正規表現のサポートを提供します.
  • reを使用する一般的なステップは、まず正規表現の文字列形式をPatternインスタンス
  • にコンパイルすることである.
  • は、その後、Patternインスタンスを使用してテキストを処理し、一致する結果(Matchインスタンス)
  • を得る.
  • は最後に、Matchインスタンスを使用して情報を取得し、他の動作を行う.
  • 正規ライブラリ
  • を導入する.
  • 正規表現フォーマット
  • を決定する
  • コンパイル式は、正規オブジェクト
  • を生成する.
  • その他の関連正則オブジェクト動作
  • # encoding: UTF-8
    #     
    import re
     
    #          Pattern  
    pattern = re.compile(r'hello')
     
    #   Pattern    ,      ,        None
    jieguo = pattern.match('hello world!')
     
    if jieguo:
        #   Match      
        print jieguo.group()
     
    ###    ###
    # hello
    

    コンパイル式による正規オブジェクトの生成
    re.compile(strPattern[, flag])
  • 例:reobj1=re.compile(bbb,re.I|re.M|re.S)
  • 解説:文字列形式の正規表現をPatternオブジェクトにコンパイルする.2番目のパラメータflagはマッチングモードであり、re.I|re.Mなどのビットまたは演算子'|'表現を使用して同時に有効にすることができる.
  • flag意味
  • re.I(re.IGNORECASE):大文字小文字を無視(かっこ内は完全な書き方、以下同)
  • M(MULTILINE):マルチラインモード、'^'および'$'の動作を変更(上図参照)
  • S(DOTALL):点任意マッチングモード、'.'を変更する動作
  • L(LOCALE):所定文字クラスwWbBsSを現在の領域設定
  • に依存するようにする.
  • U(UNICode):unicodeによって定義された文字属性
  • に、所定の文字クラスwWbBsSdDを依存させる
  • X(VERBOSE):詳細モード.このモードでは、正規表現は複数行で、空白文字を無視し、コメントを追加できます.次の2つの正規表現は等価です:
  • Patternオブジェクト
    Patternオブジェクトはコンパイルされた正規表現であり、Patternが提供する一連の方法でテキストをマッチングして検索することができます.Patternは直接インスタンス化できず、re.compile()を使用して構築する必要があります.
    Patternプロパティ:
    Patternは、式に関する情報を取得するためのいくつかの読み取り可能な属性を提供します.
  • pattern:コンパイル時に使用される式文字列.
  • flags:コンパイル時に使用するマッチングモード.数値形式.
  • groups:式のグループ数.
  • groupindex:式に別名があるグループの別名をキーとし、そのグループに対応する番号を値とする辞書で、別名がないグループは含まれません.
  • import re
    p = re.compile(r'(\w+) (\w+)(?P.*)', re.DOTALL)
    
    print "p.pattern:", p.pattern
    print "p.flags:", p.flags
    print "p.groups:", p.groups
    print "p.groupindex:", p.groupindex
    
    ### output ###
    # p.pattern: (\w+) (\w+)(?P.*)
    # p.flags: 16
    # p.groups: 3
    # p.groupindex: {'sign': 3}
    

    インスタンスメソッド[|reモジュールメソッド]:
  • match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):

  • この方法はstringのpos下付きからpatternのマッチングを試みる.patternが終了しても一致する場合は、Matchオブジェクトが返されます.マッチング中にpatternがマッチングできない場合、またはマッチングが終了せずにendposに到達した場合はNoneを返します.
    posとendposのデフォルト値はそれぞれ0とlen(string)です.re.match()はこの2つのパラメータを指定できません.パラメータflagsはpatternをコンパイルするときにマッチングモードを指定します.注意:この方法は完全に一致しているわけではありません.patternが終了するとstringに残りの文字がある場合、依然として成功と見なされます.完全に一致するには、式の最後に境界一致子'$'を付けることができます.詳細はmatchオブジェクトの説明を参照してください
  • search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):

  • この方法は、文字列内で正常に一致するサブストリングを検索するために使用されます.stringのposの下からpatternのマッチングを試み、patternが終了してもマッチング可能であればMatchオブジェクトを返します.一致しない場合はposに1を加えてから一致を再試行します.pos=endposまで一致しない場合はNoneを返します.posとendposのデフォルト値はそれぞれ0とlen(string);re.search()はこの2つのパラメータを指定できません.パラメータflagsはpatternをコンパイルするときにマッチングモードを指定します.
    #coding=utf-8
    
    import re
    
    #          Pattern  
    pattern = re.compile(r'(world)')
    
    #   search()       ,             None
    #        match()      
    match = pattern.search('hello world!')
    
    if match:
       #   Match      
       print match.group(0)   #        
       print match.group(1)   #        ,pattern = re.compile(r'(world)')      
    
    ###    ###
    # world
    # world
    
  • split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):

  • 一致するサブストリングに従ってstringを分割してリストに戻ります.masxsplitは、最大分割回数を指定し、すべてを分割することを指定しません.
    import re
    
    p = re.compile(r'\d+')
    print p.split('one1two2three3four4')
    
    ### output ###
    # ['one', 'two', 'three', 'four', '']
    
  • findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):

  • stringを検索し、一致するすべてのサブ列をリスト形式で返します.
    import re
    
    p = re.compile(r'\d+')
    print p.findall('one1two2three3four4')
    
    ### output ###
    # ['1', '2', '3', '4']
    
  • finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):

  • stringを検索し、各一致結果(Matchオブジェクト)に順次アクセスする反復器を返します.
    import re
    
    p = re.compile(r'\d+')
    for m in p.finditer('one1two2three3four4'):
       print m.group(),
    
    ### output ###
    # 1 2 3 4
    
  • sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):

  • string内の一致する各サブストリングをreplで置き換えた後、置き換えられた文字列を返します.replが文字列である場合、パケットはidまたはg、gで参照できますが、番号0は使用できません.replがメソッドである場合、このメソッドはパラメータ(Matchオブジェクト)を1つだけ受け入れ、置換のために文字列を返す必要があります(パケットは参照できません).countは、最大置換回数を指定するために使用され、タイミングを指さずにすべて置換されます.
    import re
    
    p = re.compile(r'(\w+) (\w+)')
    s = 'i say, hello world!'
    
    print p.sub(r'\2 \1', s)
    
    def func(m):
       return m.group(1).title() + ' ' + m.group(2).title()
    
    print p.sub(func, s)
    
    ### output ###
    # say i, world hello!
    # I Say, Hello World!
    

    Matchオブジェクト
    Matchオブジェクトは1回のマッチングの結果であり、今回のマッチングに関する多くの情報が含まれており、Matchが提供する読み取り可能な属性や方法を使用してこれらの情報を取得することができます.
    ツールバーの
  • string:一致するときに使用されるテキスト.
  • re:マッチング時に使用されるPatternオブジェクト.
  • pos:テキスト内の正規表現が検索を開始するインデックス.値は、Pattern.match()メソッドとPattern.seach()メソッドの同じ名前のパラメータです.
  • endpos:テキスト内の正規表現が検索を終了するインデックス.値は、Pattern.match()メソッドとPattern.seach()メソッドの同じ名前のパラメータです.
  • lastindex:最後に取得されたパケットのテキスト内のインデックス.キャプチャされたパケットがない場合はNoneになります.
  • lastgroup:最後にキャプチャされたパケットの別名.このパケットに別名がないか、キャプチャされていないパケットがある場合はNoneになります.

  • 方法
  • group([group 1,...]):1つ以上のパケットがキャプチャされた文字列を取得する.複数のパラメータを指定すると、メタグループとして返されます.group 1は番号を使用しても別名を使用してもよい.番号0は、一致するサブ列全体を表します.パラメータを記入しない場合はgroup(0)を返します.文字列をキャプチャしていないグループはNoneを返します.複数回キャプチャされたグループは、最後にキャプチャされたサブストリングを返します.
  • groups([default]):すべてのパケットがキャプチャされた文字列をメタグループとして返します.呼び出しgroup(1,2,...last)に相当します.defaultは、キャプチャ文字列のないグループがこの値で置き換えられ、デフォルトではNoneであることを示します.
  • groupdict([default]):別名のあるグループの別名をキーとし、そのグループが切り取ったサブ列を値とする辞書を返します.別名のないグループは含まれません.defaultの意味は同じです.
  • start([group]):string内の指定したグループによってキャプチャされたサブストリングの開始インデックス(サブストリングの最初の文字のインデックス)を返します.groupのデフォルト値は0です.
  • end([group]):stringにおける指定されたグループキャプチャされたサブストリングの終了インデックス(サブストリングの最後の文字のインデックス+1)を返します.groupのデフォルト値は0です.
  • span([group]):戻り(start(group)、end(group))
  • expand(template):一致するパケットをtemplateに代入して戻ります.templateでは、idまたはg、g参照パケットを使用できますが、番号0は使用できません.idとgは等価です;しかし、10は10番目のグループとみなされ、1の後に文字'0'を表現したい場合は、g<1>0しか使用できません.
  • import re
    m = re.match(r'(\w+) (\w+)(?P.*)', 'hello world!')
    
    print "m.string:", m.string
    print "m.re:", m.re
    print "m.pos:", m.pos
    print "m.endpos:", m.endpos
    print "m.lastindex:", m.lastindex
    print "m.lastgroup:", m.lastgroup
    
    print "m.group(1,2):", m.group(1, 2)
    print "m.groups():", m.groups()
    print "m.groupdict():", m.groupdict()
    print "m.start(2):", m.start(2)
    print "m.end(2):", m.end(2)
    print "m.span(2):", m.span(2)
    print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')
    ### output ###
    # m.string: hello world!
    # m.re: <_sre.sre_pattern object="" at="">
    # m.pos: 0
    # m.endpos: 12
    # m.lastindex: 3
    # m.lastgroup: sign
    # m.group(1,2): ('hello', 'world')
    # m.groups(): ('hello', 'world', '!')
    # m.groupdict(): {'sign': '!'}
    # m.start(2): 6
    # m.end(2): 11
    # m.span(2): (6, 11)
    # m.expand(r'\2 \1\3'): world hello!