【问题标题】:Finding a combination in a string using regex in python在 python 中使用正则表达式在字符串中查找组合
【发布时间】:2014-01-10 17:41:54
【问题描述】:

我正在寻找一个组合,但它不起作用

>>> whole = ('\n1. WIPO is located at\n(A) New York\n(B) London\n(C) Geneva\n(D) Paris\n')
>>> match = re.findall('1\.\s(\w+\s)+\w+\n', whole)
>>> print(match)
['located']

我希望它返回"1. WIPO is located at\n"。但它只是返回['located ']

【问题讨论】:

    标签: python regex string python-2.7


    【解决方案1】:

    使组非捕获,使用(?:...) 而不是(...)

    re.findall('1\.\s(?:\w+\s)+\w+\n', whole)
    

    如果存在捕获组,re.findall() 会改变行为并仅返回匹配的组;如果没有捕获的组,则返回整个匹配项:

    >>> import re
    >>> whole = '\n1. WIPO is located at\n(A) New York\n(B) London\n(C) Geneva\n(D) Paris\n'
    >>> re.findall('1\.\s(?:\w+\s)+\w+\n', whole)
    ['1. WIPO is located at\n']
    

    如果您只希望只有一个匹配项,则不要使用re.findall(),而是使用re.search(),并在生成的Match 实例上调用.group()

    >>> re.search('1\.\s(?:\w+\s)+\w+\n', whole).group()
    '1. WIPO is located at\n'
    

    在这里,该组是否正在捕获不再重要。

    【讨论】:

    • 所以,用菜鸟的​​话来说,我必须在每次捕获中的 '(' 之后加上 '?:' ?你能解释一下 '?:' 的作用吗?
    • @Ufoguy:确实;这就是捕获组和非捕获组之间的语法差异。
    【解决方案2】:

    查看Match Object

    print match.groups()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2011-06-11
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多