正则表达式:从组中排除,可能存在也可能不存在的字符串

时间:2017-06-30 18:18:16

标签: python regex regex-lookarounds regex-group

我有这个文字

##### PRIORITY
- Priority 1
- Priority 2

##### ISSUE TYPE
<!--- comment -->
- Problem / Case
- Requirement

我试图根据标题(优先级,问题类型)每个类别的选项。

我的正则表达式是这样的:

(?:#####\s?issue type.*?)(?:<!---.*?-->)?(.*?)(?:#####|$)

我已将三个小组分开(标题,评论,内容)。

如果没有评论块,正则表达式应该正常工作,但如果有注释块,它会被我的第三个(内容)组捕获。如何从第三组中排除评论部分(如果存在)?

我尝试了这样的负面预测:

(?:#####\s?issue type.*?)(?:<!---.*?-->)?(?!(<!---.*?-->).*?)(?:#####|$)

但似乎不起作用。

A link to pythex for help.

1 个答案:

答案 0 :(得分:1)

你可以使用这个正则表达式进行前瞻:

(?:#####\s*issue type.*\s+)(?:<!---.*?-->\s+)?([\s\S]*?)(?=\s*(?:#####|$))

RegEx Demo

(?=\s*(?:#####|$))是一个先行者,断言我们在当前位置之前有#####或行尾。这有助于您匹配给定输入中的多个匹配项。

<强>代码:

>>> reg = re.compile(r'(?:#####\s*issue type.*\s+)(?:<!---.*?-->\s+)?([\s\S]*?)(?=\s*(?:#####|$))', re.I)
>>> print(reg.findall(test_str))
['- Problem / Case\n- Requirement', '- Problem / Case\n- Requirement']