pythonで正規表現を使用したグループマッチングが成功したかどうかを自己参照

3681 ワード

前に名前やグループ番号で自分の正規表現のグループ内容を引用することを学び,前後関連式の等しい判断を実現できる.さらに、例えば、現在のキルトマッチングに成功した後、ifに相当する別のモードを選択して識別するモードを選択し、マッチングに成功しない場合、if...else...文の選択.この新しい文法を学びましょう:(?(id)yes-expression|no-expression).ここでidはグループ名またはグループ番号を表し、yes-expressionはグループマッチングに成功した後に選択された正規表現であり、no-expressionは不マッチングに成功した後に選択された正規表現である.次の例を示します.
#python 3.6
#    
#http://blog.csdn.net/caimouse/article/details/51749579
#
import re

address = re.compile(
    '''
    ^

    # A name is made up of letters, and may include "."
    # for title abbreviations and middle initials.
    (?P
       ([\w.]+\s+)*[\w.]+
     )?
    \s*

    # Email addresses are wrapped in angle brackets, but
    # only if a name is found.
    (?(name)
      # remainder wrapped in angle brackets because
      # there is a name
      (?P(?=(<.>$)))
      |
      # remainder does not include angle brackets without name
      (?=([^]$))
     )

    # Look for a bracket only if the look-ahead assertion
    # found both of them.
    (?(brackets)
      [\w\d.+-]+       # username
      @
      ([\w\d.]+\.)+    # domain name prefix
      (com|org|edu)    # limit the allowed top-level domains
     )

    # Look for a bracket only if the look-ahead assertion
    # found both of them.
    (?(brackets)>|\s*)

    $
    ''',
    re.VERBOSE)

candidates = [
    u'Cai junsheng ',
    u'No Brackets [email protected]',
    u'Open Bracket ',
    u'[email protected]',
]

for candidate in candidates:
    print('Candidate:', candidate)
    match = address.search(candidate)
    if match:
        print('  Match name :', match.groupdict()['name'])
        print('  Match email:', match.groupdict()['email'])
    else:
        print('  No match')

結果は次のように出力されます.
Candidate: Cai junsheng
  Match name : Cai junsheng
  Match email: [email protected]
Candidate: No Brackets [email protected]
  No match
Candidate: Open Bracket   No match
Candidate: Close Bracket [email protected]>
  No match
Candidate: [email protected]
  Match name : None
  Match email: [email protected]
ここで、nameグループが現れるとカッコ<>が検索され、カッコがペアにならないと一致しません.nameグループが表示されない場合はカッコは必要ありませんので、別の正規表現を選択します.
深入浅出Numpyhttp://edu.csdn.net/course/detail/6149 
Pythonゲーム開発入門
http://edu.csdn.net/course/detail/5690
Cコンパイラの修正もできます
http://edu.csdn.net/course/detail/5582
カードゲーム開発
http://edu.csdn.net/course/detail/5538 
五子棋ゲーム開発
http://edu.csdn.net/course/detail/5487RPGゲームは入門から精通までhttp://edu.csdn.net/course/detail/5246WiXインストールツールの使用http://edu.csdn.net/course/detail/5207ロシアキューブゲーム開発http://edu.csdn.net/course/detail/5110boostライブラリ入門ベースhttp://edu.csdn.net/course/detail/5029Arduino入門の基礎http://edu.csdn.net/course/detail/4931Unity5.xゲームの基本http://edu.csdn.net/course/detail/4810TensorFlowAPI攻略http://edu.csdn.net/course/detail/4495TensorFlow基本チュートリアルの開始http://edu.csdn.net/course/detail/4369C++標準テンプレートライブラリ入門から精通までhttp://edu.csdn.net/course/detail/3324老菜鳥とC++を習うhttp://edu.csdn.net/course/detail/2901老菜鳥に学ぶpythonhttp://edu.csdn.net/course/detail/2592VC 2015でtinyxmlライブラリの使用を学ぶhttp://edu.csdn.net/course/detail/2590WindowsでのSVNのバージョン管理と実戦http://edu.csdn.net/course/detail/2579VisualStudio 2015開発C++プログラムの基本使用http://edu.csdn.net/course/detail/2570VC 2015でprotobufプロトコルを使用http://edu.csdn.net/course/detail/2582VC 2015でMySQLデータベースの使用を学ぶhttp://edu.csdn.net/course/detail/2672