Skip to main content
 首页 » 编程设计

python之为什么这个环视正则表达式会返回意外结果

2024年09月03日27Terrylee

txt = "r/1 /r/2 er/3" 
x = re.findall("(?!e)r\/[0-9]", txt) 

以上代码匹配r/1、r/2、r/3(即一切)

将其更改为 ?=e 时不匹配任何内容

不是第一个代码应该只匹配 r/1 和 r/2 因为我基本上是在说“匹配模式 r/digit 但前提是它不是以 e"

开头

请您参考如下方法:

(?!e)是一个否定的ahead,如果在当前位置的右侧,它的模式找到匹配项,则匹配失败。所以,(?!e)r总是匹配,因为 r不是 e , 和 (?!e)r\/[0-9] = r\/[0-9] (即前瞻是多余的,因为它不会影响匹配过程)。

你想要一个 negative lookbehind , (?<!e) :

(?<!e)r/[0-9]+ 

参见 regex demo .我还建议量化 [0-9]匹配 1 个或多个数字的模式。

详情

  • (?<!e) - 确保没有 e 的负面回顾紧靠当前位置的左侧
  • r/ - 一个 r/子串
  • [0-9]+ - 1 个以上数字。