如何在Python正则表达式中匹配 - 但不捕获 - ?

时间:2011-08-01 22:42:38

标签: python regex

我有一个功能吐出“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文档:

  

(?:...)   常规括号的非捕获版本。匹配括号内的正则表达式,但在执行匹配后或在模式中稍后引用时,无法检索组匹配的子字符串。

是什么?

提前致谢!

3 个答案:

答案 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。部分是可选的(因为你并不总是需要它)。