【问题标题】:Python regular expression different match between findall and searchPython正则表达式findall和search之间的不同匹配
【发布时间】:2014-07-30 16:43:53
【问题描述】:
>>> s = 'Paris is the capital and most populous city of France'
>>> re.search('(Pa.+?)\s', s).group()
'Paris '
>>> re.findall('(Pa.+?)\s', s)
['Paris']

为什么使用这两种方法提取匹配的字符串会得到两个不同的结果?

编辑:巴黎之后的空间是我所关心的。括号不应该排除空格吗? Blender 说有 group(0) 和 group(1)。我尝试在 c- 上匹配 r"(c.+?)\s" 和 group(0) 是 'capital' 而 group(1) 是 'capital',没有 group(2)。

【问题讨论】:

  • 因为.group().group(0),这是整个匹配。如果您想要第一组,请使用.group(1)
  • 避免对正则表达式使用普通字符串。使用原始字符串,以避免双重转义或转义序列产生意外结果。例如:r'(Pa.+?)\s',在您的情况下。
  • 嗯,我不明白“Paris”如何匹配结尾包含非可选空格的正则表达式。
  • 或者,只匹配非空格字符;即Pa\S+。我认为它尽可能简单,并且比.+? 更快(当然,在小字符串上速度差异可以忽略不计)。
  • @huggie:在 Python 中,所有无法识别的字符串文字都保持不变,所以它确实在此时此地工作。关键是您可能不知道所有转义序列,并且不应该从您现在工作的代码中推断出它将在未来工作。你正在做一个正则表达式元字符转义也更清楚,而不是让读者模棱两可它是字符串还是正则表达式转义。

标签: python regex


【解决方案1】:

在 regex 匹配对象中捕获组的编号与 Python 中的大多数事物有些不同,使用从 1 开始的索引。我认为这样做是为了与其他编程语言的正则表达式代码兼容,其中\1 一直是对第一个捕获组的反向引用的语法。

捕获组匹配的文本可以通过m.group(1) 访问,而不是像您想象的那样m.group(0)。如果您使用m.group(0)(或不带参数的m.group()),您将获得整个匹配的文本,而不是捕获的组。您可以阅读更多详细信息in the docs

请注意,如果您实际上不想在模式中占用空间,您可能希望改用 \b 转义序列来匹配零长度字边界。

【讨论】:

  • 谢谢,也感谢 \b。
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2015-01-27
  • 2011-07-18
  • 2016-09-02
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多