正则表达式捕获给定字符串锚点之间的字符串

时间:2016-08-19 11:49:16

标签: python regex

我有一个日志文件,我正在尝试使用正则表达式(python)进行解析。每行在行的某处包含标记“BEGIN”和“END”。另外,一行可以在“BEGIN”和“END”标签之间的某处包含一个或多个“VALUE”标签。如果给定行上没有“VALUE”标记,我想捕获“BEGIN”和“END”标记之间的字符串。但是,如果给定行上有“VALUE”标记,我想捕获标记“BEGIN”...“VALUE”,“VALUE”...“VALUE”和“VALUE”之间的所有字符串。 ..“END”标签对。请注意,捕获字符串也可能为空。

给定输入:

Line1: words we can ignoreBEGINvalue1VALUEvalue with spaceVALUEvalue_with_@VALUElastvalueENDwords we can ignore
Line2: BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore
Line3: words we can ignoreBEGINlastvalueEND

正则表达式应该返回:

Line1: (1)value1 (2)value with space (3)value_with_@ (4)lastvalue
Line2: (1)value1 (2) (3) (4)lastvalue
Line3: (1)lastvalue

如果一行中有多个“VALUE”标记,则下面的正则表达式会失败,在这种情况下,它似乎只捕获“BEGIN”...“VALUE”和“VALUE”之间的字符串...“END” ,但未能捕获“VALUE”...“VALUE”匹配:

BEGIN(.*?)(?:VALUE(.*?))*END

1 个答案:

答案 0 :(得分:1)

一种不完全使用正则表达式的简单方法,捕获BEGIN和END之间的所有内容,然后将其拆分为VALUE。

>>>test_cases = ['words we can ignoreBEGINvalue1VALUEvalue with spaceVALUEvalue_with_@VALUElastvalueENDwords we can ignore', 'BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore', 'words we can ignoreBEGINlastvalueEND']
>>> patt = re.compile(r'BEGIN(.*)END')
>>> for test in test_cases:
...     matched = patt.search(test)
...     if matched is not None:
...         print matched.group(1).split('VALUE')

['value1', 'value with space', 'value_with_@', 'lastvalue']
['value1', '', '', 'lastvalue']
['lastvalue']