python正则表达式:使用负查找寻找正确的模式

2024-04-29 13:07:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

第一个捕获组用于获取特征ID,第二个用作特征描述。 问题是,当出现带有[Rr]evert的字符串时,两种模式都匹配。我希望达到的目标是:

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

在以下示例中revert_pattern应仅匹配revert_feature_message,而add_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*(ID\d{3})\s*\](.*)

就像add_pattern但它没有锻炼。你能帮我纠正一下吗


Tags: 工具字符串addid消息rr模式some
1条回答
网友
1楼 · 发布于 2024-04-29 13:07:04

还原模式[Rr]evert.*\[\s*(ID\d{3})\s*\](.*)已仅与revert_feature_message匹配

要仅匹配add_feature_messages中的字符串,可以断言该字符串不包含revert或revert

^(?!.*[Rr]evert).*\[\s*(ID\d{3})\s*\](.*)

Regex demo

或者更具体一点:

^(?!.*[Rr]evert [^][]*\[\s*ID\d{3}\s*]).*\[\s*(ID\d{3})\s*\](.*)

Regex demo

如果Revert位于字符串的开头,则可以省略前导的.*

相关问题 更多 >