python - 正则表达式捕获给定字符串 anchor 之间的字符串

标签 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

最佳答案

一种无需完全使用正则表达式的简单方法,捕获 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/

相关文章:

python - 不明白为什么 `__index__` 方法有效

python - 是否有任何 Python3 兼容模块来读取/写入 IPTC 数据?

Python不在for循环中打印文件内容

java - 查找子字符串出现的总数

Python:NLTK 中的形容词同义词集

python - 如何将 Django 模块添加到 pydiction 字典?

regex - 如何使用Excel VBA脚本删除某些字符

ruby - 如何在许多匹配项中使用 ruby​​ gsub Regexp?

java - 使用正则表达式模式获取两个表达式之间的所有子字符串(JAVA)

php - 正则表达式 - 为什么这个 .*(点星号)不匹配换行符?