有没有办法匹配包含某个值的所有部分名称,如下所示:
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