2012-04-30 25 views
0

我有一個正則表達式匹配的中間名,看起來像這樣:re.escape修改行爲

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 \ nBorn :\ nAkron,俄亥俄州\ nCollege:中 藝術\ nBachelor,凱尼恩學院,1998年

這種模式能正常工作,而中間名 '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是否安全使用的意思,它不會改變表達的行爲?在非字母數字字符之前添加反斜槓會導致它不匹配?

任何幫助,將不勝感激!

回答

1

使用上已經包含正則表達式的特殊字符會尋找那些文字字符的東西re.escape。

兩個建議位置:

  1. 如果可能的話,爲什麼不使用re.IGNORECASE測試正則表達式不區分大小寫?

  2. 如果沒有,你可以做這樣的事情

first_name= 'Matthew'

last_name = 'Walsh' 

first_name_re = "".join('(%s|%s)' % (re.escape(c.upper()),re.escape(c.lower())) for c in first_name) 
last_name_re = "".join('(%s|%s)' % (re.escape(c.upper()),re.escape(c.lower())) for c in last_name) 


# now that they are safe -we can simply put them in the middle of the regex 
middle_name_regex_str = "\b?((%s (?P<middle_name1>[A-Z][^ ]?[a-z]*)?%s)|(%s (?P<middle_name2>[A-Z][^ ]?[a-z]*)?%s))" % (first_name_re, last_name_re, first_name_re, last_name_re) 

不知道這裏格式化args來順序,但你明白了吧

+0

謝謝,長相好。 – WeaselFox

+0

歡呼聲。我有一些錯誤,刷新頁面。 –