首页 > 解决方案 > 正则表达式匹配失败

问题描述

我有以下正则表达式,它应该只匹配 line2,我只想匹配行,Revert为什么正则表达式也匹配 line 1?如何修复它,使其只匹配 line2 而不匹配 line1?

revert_change = False
line1 = '<change://problem/16539021> Align RNG buffers to 14 bytes to make sure it is aligned'
line2 = 'Revert <change://problem/16539021> Align RNG buffers to 14 bytes to make sure it is aligned'

if re.findall("(?!.*(Revert|revert))[\S]*(?:change:\/\/problem\/)(\d{8,8})", line1):
    match = re.findall("(?!.*(Revert|revert))[\S]*(?:rdar:\/\/problem\/)(\d{8,8})", line1)
    print "Revert change detected...%s"%match
    revert_change = True
print revert_change

输出:-

True

预期输出:-

FALSE

标签: python

解决方案


你犯了一个错误的逻辑。

(?!.*(Revert|revert))
  ^

这与 , 相结合re.match,断言字符串中没有 Revertor revert

要否定断言,请更改(?!(?=

(?=.*(Revert|revert))......
  ^

请注意,(?=并且(?!是前瞻,它们确保正则表达式匹配即将到来的部分,而不是实际匹配它。如果要匹配Revert,只需使用常规组:

.*?(?:Revert|revert)\s*\S*(?:change:\/\/problem\/)(\d{8})
^^^^^^              ^^^^^^

推荐阅读