【问题标题】:regex match failing正则表达式匹配失败
【发布时间】:2018-12-19 10:22:53
【问题描述】:

我有以下正则表达式,它应该只匹配 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

【问题讨论】:

  • 您当前的模式实际上已经匹配第 1 行。

标签: python


【解决方案1】:

你的逻辑是错误的。

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

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

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

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

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

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

【讨论】:

  • 这适用于不匹配第 1 行的情况,但这与包含单词“Revert”的第 2 行不匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多