有没有办法匹配包含某个值的所有部分名称,如下所示:
section aaa:
some values
value 5
section bbb:
more values
value 6
section ccc:
some values
value 5
section ddd:
more values
value 6
例如:
section (.*?):.*?value 6 (DOTALL|MULTILINE)
将匹配aaa,ccc而不是bbb, ddd。
有没有办法匹配bbb和ddd?
谢谢
更新:有一些解决方案(有效)基于值行不包含冒号或不以空格开头的假设。然而,有没有办法匹配value 6并获得它之前最接近的部分,即即使值包含冒号或没有缩进?
nhahtdh 的回答:你不用正则表达式向后搜索。有look-behind(这种情况下需要变宽look-behind),但是效率极低,Python默认re模块不支持任何形式的look-behind
我的结论:这可以通过带有上述假设的纯正则表达式来完成,或者(我的首选)是使用drawk建议的组合正则表达式-python方法(它也有一些假设,即该部分必须包含value)
更新2:这就是我最终的结果。它似乎在没有上述限制的情况下工作。它确实假设值不能以 开头section .*:。我们将该部分匹配到下一个部分,但不包括它(通过使用(?=...)语法),并且为了匹配我们拥有的最后一个部分,\Z它是字符串的结尾。
for m in re.finditer(r'^section (.*?):(.*?)(?=(^section .*:)|\Z)', str1, re.MULTILINE | re.DOTALL):
section = m.group(1)
values = m.group(2)
if "value 6" in values:
print section