【问题标题】:Python regex not matching when regex101 shows otherwise当 regex101 以其他方式显示时,Python 正则表达式不匹配
【发布时间】:2020-08-14 15:48:56
【问题描述】:

我正在尝试匹配以下模式:

...hello world...foo...bar... 其中“.”可以是任何字符。此外,它不应包含单词alicebob

这是我尝试过的:pattern = r'^(?!.*(alice|bob)).*hello world.*foo.*bar',我在 regex101.com 上对其进行了测试,它可以工作,但是当我尝试re.findall(pattern, "hello world, this is foo and bar") 时,它显示不匹配。

我对正则表达式还很陌生,不知道哪里出了问题,提前感谢所有帮助!

【问题讨论】:

  • 你能提供一个链接来说明这在 regex101 上是如何工作的吗? regex101.com/r/T6URgt/1这是我看到的。
  • @axe319 抱歉,我原来的问题中有一个类型,它是 .*hello world 而不是 *.hello world,刚刚更新
  • 尝试将您的模式括在括号中。 regex101.com/r/T6URgt/3
  • 谢谢它现在似乎工作了!知道它为什么会这样吗?

标签: python-3.x regex


【解决方案1】:

re.findall 要么返回所有捕获组的列表(如果有)。如果不是,则返回整个匹配项。

在您的示例中,(alice|bob) 是一个捕获组,即使它在负前瞻中也是如此。这就是为什么它返回一个带有空字符串的list。 在整个模式周围添加括号使其成为您的第一个捕获组。因此将作为列表中的第一个元素返回。

有其他方法可以解决这个问题。您可以删除您的(alice|bob) 捕获组并将其替换为.*alice|.*bob),这与没有捕获组的情况相同。

完整代码:

import re

pattern = r'^(?!.*alice|.*bob).*hello world.*foo.*bar'
print(re.findall(pattern, 'hello world, this is foo and bar'))

【讨论】:

  • 还有非捕获组(?:alice|bob)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多