python regex:寻找正确的模式与负向后看



我使用python工具检查git日志提交消息,以确定是否引入或恢复给定ID的功能。我无法更改工具的代码。只能提供适当的正则表达式作为输入。输入如下所示:

input_regexes = {
"add_pattern": r".*[s*(IDd{3})s*](.*)"
"revert_pattern": r"[Rr]evert.*[s*(IDd{3})s*](.*)"
}

第一个捕获组用于获取特性ID,第二个捕获组用作特性描述。问题是,当出现带有[Rr]evert的字符串时,两个模式都匹配。我想实现的是:

  • revert_pattern模式只匹配包含括号中ID和[Rr]evert前面的提交消息
  • add_pattern模式只匹配包含括号中ID的提交消息,不包含前面的[Rr]evert

在下面的例子中,revert_pattern应该只匹配revert_feature_messageadd_pattern应该只匹配add_feature_messages中的字符串:

revert_feature_message='Revert "[ID123] some cool feature."'
add_feature_messages=[
'[ID123] some cool feature.',
'some prefix [ID123] some cool feature'
]

我试着使用:

(?<!Revert).*?[s*(IDd{3})s*](.*)

作为add_pattern,但它没有锻炼。你能帮我改一下吗?

恢复模式[Rr]evert.*[s*(IDd{3})s*](.*)已经只匹配revert_feature_message

如果只匹配add_feature_messages中的字符串,可以断言该字符串不包含revert或revert。

^(?!.*[Rr]evert).*[s*(IDd{3})s*](.*)

Regex演示

或者更具体一点:

^(?!.*[Rr]evert [^][]*[s*IDd{3}s*]).*[s*(IDd{3})s*](.*)

Regex演示

如果Revert在字符串的开头,可以省略前面的.*

最新更新