我有一个日志文件,我正在尝试使用正则表达式(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
答案 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']