我有一个日志文件,我正在尝试使用正则表达式 (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
最佳答案
一种无需完全使用正则表达式的简单方法,捕获 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']
关于python - 正则表达式捕获给定字符串 anchor 之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038371/