我有一个功能吐出“Washington D.C.,DC,USA”作为输出。我需要捕捉“华盛顿特区”,其原因与我如何处理该国其他城市有关。 (注意:这是不和“D.C.”相同,我需要逗号在“华盛顿”和“DC”之间,空格很好)
我不能为我的生活弄清楚如何抓住这个。
这是我尝试过的:
>>>location = "Washington D.C., DC, USA"
>>>match = re.search(r'\w+\s(?:D\.C\.), \w\w(?=\W)', location).group()
>>>match
u'Washington D.C., DC'
不是(?:...)应该匹配(而不是捕获)“D.C。”?
以下是2.7.2文档:
(?:...) 常规括号的非捕获版本。匹配括号内的正则表达式,但在执行匹配后或在模式中稍后引用时,无法检索组匹配的子字符串。
是什么?
提前致谢!
答案 0 :(得分:10)
这确实是一种聪明的方式,但不是捕捉并不意味着将其从匹配中删除。它只是意味着,它不被视为输出组。
你应该尝试做类似以下的事情:
match = re.search(r'(\w+)\s(?:D\.C\.), (\w\w)\W', location).groups()
这会打印('Washington', 'DC')
。
请注意.group()
和.groups()
之间的区别。前者为您提供匹配的整个字符串,后者仅为捕获的组。请记住,您需要在输出中指定要包含的内容,而不是要排除的内容。
答案 1 :(得分:6)
matches = re.search(r'(\w+\s)(?:D\.C\.)(, \w\w)(?=\W)', location).group(1,2)
match = ''.join(matches)
当它表示“非捕获”时,这意味着它不会为它创建一个单独的捕获组。文字“D.C.”还在比赛中。见http://docs.python.org/library/re.html#match-objects
答案 2 :(得分:0)
我迟到了,前两个答案很棒,但是如果你有任何机会需要一个普通的正则表达式来将城市,后缀,州/省和国家组合拉出来,但你知道DC是一个烦人的特殊情况,您可以使用以下内容:
>>> import re
>>> city = re.compile(r'(\w+(?:\sD\.C\.)?), \w\w(?=\W)')
>>> location = "Washington D.C., DC, USA"
>>> re.search(city, location).group(1)
'Washington D.C.'
>>> location = "Vancouver, BC, Canada"
>>> re.search(city, location).group(1)
'Vancouver'
除了非捕获(为了节省内存)之外,D.C。部分是可选的(因为你并不总是需要它)。