【问题标题】:How to match--but not capture--in Python regular expressions?如何在 Python 正则表达式中匹配(但不捕获)?
【发布时间】:2011-08-01 22:42:38
【问题描述】:

我有一个函数可以输出“Washington D.C., DC, USA”作为输出。我需要拍摄“华盛顿特区”,原因与我如何处理该国其他每一个城市有关。 (注意:这与“DC”相同,我需要逗号在“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 文档:

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

什么给了??

提前致谢!

【问题讨论】:

    标签: python regex


    【解决方案1】:

    这确实是一个聪明的方法,但不捕获并不意味着将其从匹配中删除。这只是意味着,它不被视为输出组。

    您应该尝试执行类似以下的操作:

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

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

    注意.group().groups() 之间的区别。前者为您提供匹配的整个字符串,后者仅提供捕获的组。请记住,您需要指定要在输出中包含的内容,而不是要排除的内容。

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

      • 对,我认为 OP 的真正问题是不带参数的 group() 返回匹配的整个字符串。除了使用 args 调用 group() 之外,使用 python 处理此问题的另一种方法是调用 groups() 并捕获子匹配项(这将正确排除“D.C.”
      【解决方案3】:

      我来晚了,前两个答案很好,但如果你有机会需要一个通用正则表达式来将城市从城市、后缀、州/省和国家的组合中拉出来,但你知道华盛顿特区。是一个烦人的特殊情况,你也许可以使用以下方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2015-08-05
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多