次のようなミドルネームに一致する正規表現があります。
first_name = 'Matthew'
last_name = 'Walsh'
for char in first_name:
new_first_name+='(' + char.lower() + '|' + char.upper() + ')'
for char in last_name:
new_last_name+='(' + char.lower() + '|' + char.upper() + ')'
middle_name_regex_str = "\b?((" + new_first_name + " (?P<middle_name1>[A-Z][^ ]?[a-z]* )?" + new_last_name + ")|(" + new_last_name + " (?P<middle_name2>[A-Z][^ ]?[a-z]* )?" + new_first_name + "))"
これが機能するパターンは次のとおりです。
MATTHEW B. WALSH、DMD\n生まれ:\nオハイオ州アクロン\n大学:\n1998 年、ケニオン カレッジで学士号を取得
このパターンでは問題なく動作し、ミドル ネーム「B」と一致します。
ただし、安全な側にいて、姓と名をエスケープしたいのですが、追加するre.escape
と失敗します:
middle_name_regex_str = "\b?((" + re.escape(new_first_name) + " (?P<middle_name1>[A-Z][^ ]?[a-z]* )?" + re.escape(new_last_name) + ")|(" + re.escape(new_last_name) + " (?P<middle_name2>[A-Z][^ ]?[a-z]* )?" + re.escape(new_first_name) + "))"
そして今、正規表現は正しく一致しません:
regex = re.compile(middle_name_regex_str)
regex.search('MATTHEW B. WALSH, D.M.D.\nBorn:\nAkron, Ohio\nCollege:\nBachelor of Arts, Kenyon College, 1998')
これは何も返しません。
re.escape は、式の動作を変更しないという意味で安全に使用できませんか? 英数字以外の文字の前にバックスラッシュを追加すると、一致しない可能性がありますか?
どんな助けでも大歓迎です!