0

我有一个正则表达式来匹配看起来像这样的中间名:

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 不应该安全使用吗?在非字母数字字符之前添加反斜杠会导致它不匹配怎么办?

任何帮助,将不胜感激!

4

1 回答 1

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 的顺序,但你明白了

于 2012-04-30T13:17:37.557 回答