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

16 投票
3 回答
26159 浏览
提问于 2025-04-16 22:41

我有一个函数,它输出“Washington D.C., DC, USA”。我需要提取“Washington, DC”,因为这和我处理全国其他城市的方式有关。(注意:这不是“D.C.”,我需要在“Washington”和“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

我来得有点晚,前两个回答都很好,不过如果你需要一个通用的正则表达式,用来从城市、后缀、州/省和国家的组合中提取城市名,而你知道华盛顿D.C.是个麻烦的特殊情况,你可以试试下面这个:

>>> 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.部分是可选的(因为你不总是需要它),而且它是非捕获的(这样可以节省内存)。

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

14

这确实是个聪明的方法,但“不捕获”并不意味着从匹配中去掉它。它只是表示,这个部分不会被当作输出组。

你可以尝试做类似下面的事情:

match = re.search(r'(\w+)\s(?:D\.C\.), (\w\w)\W', location).groups()

这样会打印出 ('Washington', 'DC')

注意 .group().groups() 之间的区别。前者会给你整个匹配到的字符串,后者只会给你捕获到的组。记住,你需要指定你想要在输出中包含的内容,而不是你想要排除的内容。

撰写回答