REGEX 匹配两个 headers 之间的文档部分
REGEX match for portions of a document between two headers
我正在尝试编写捕获文档多个部分的 python 兼容 REGEX,但未能成功。我的代码实际上将在 Python 中,但现在我只尝试在 regex101.com 中获得正确的表达式。 (显然不成功:))
我的文字是 file-based,看起来像这样:
<#
.概要
这是概要文本,即多行
概要 - 我想匹配所有这些文本
作为捕获组。
.参数
这是另一块
我要捕获的多行文本
.SOMEOTHER HEADER
和一些其他的多行文本
#
我想在全球范围内捕获 2 个组(header 和 body 文本)。 (即每个部分)。
我的最终目标是 python 字典数组;
[
{'header':'SYNOPSIS', 'text': }
{'header':'PARAMETER', 'text': }
]
header 部分始终锚定在行首,并带有“.”。然后是大写的 TEXT。该部分的 body 包括任何单词和 non-word 个字符,包括 CR/LF(基于 windows)。
不保证 Header 名称是固定的文字,或以特定的顺序排列。我也不知道可能存在多少 header。
现在看起来像这样
(^\.[A-Z]+)([\n\W\w]+)
现在我可以匹配 header 后跟 body,但我很难告诉 REGEX 本质上是 'stop looking when you hit the next .HEADERTEXT'.
我已经创建了一个 Regex101 https://regex101.com/r/YqibeH/4 如果它有用的话(不确定这可能会怎样)。 . .
我的伪代码是这样的,
查找所有以^.[A-Z]开头的行作为捕获组,然后继续匹配header之后的所有文本(多行)作为第二个捕获组。在下一个 header 开始之前停止捕获 ^.[A-Z]
非常感谢任何帮助。
我相信您正在寻找的是向前看。此外,您所做的搜索是贪婪的,应该改为惰性量词。话虽如此。这应该有效。
^\.\w+[\n\W\w]+?(?=^\.\w+|^#>)
https://regex101.com/r/YqibeH/7
^\.\w+
贪婪地捕获你的 header 文字。
[\n\W\w]+?
懒惰地搜索您的 body 文本。
(?=^\.\w+|^#>)
直到它向前看并找到以另一个 header 文本开头的行或以 header 结束标记开头的行。
请注意,如果使用贪婪量词 +
而不是 +?
,它将继续匹配直到它可以匹配的最后一个可能的实例。
text = '<#\n.SYNOPSIS\nThis is the block of code that I would like to have matched along with the .SYNOPSIS header, ' \
'as this block belongs to SYNOPSIS\n .NOTES\n This block needs to belong with\nNOTES ' \
'header\n.SOMEOTHERHEADER\nAnd resulting text\n\n#> '
pattern = "(\.[A-Z]+\n)+"
import re
print(re.split(pattern, text))
如果我没看错你的问题,我用下面的方法解决了。这样你就有了一个列表,其中包含你需要通过清理字符串追加到你的字典中的所有元素,当然。
我正在尝试编写捕获文档多个部分的 python 兼容 REGEX,但未能成功。我的代码实际上将在 Python 中,但现在我只尝试在 regex101.com 中获得正确的表达式。 (显然不成功:))
我的文字是 file-based,看起来像这样:
<#
.概要
这是概要文本,即多行
概要 - 我想匹配所有这些文本
作为捕获组。
.参数
这是另一块
我要捕获的多行文本
.SOMEOTHER HEADER
和一些其他的多行文本
#
我想在全球范围内捕获 2 个组(header 和 body 文本)。 (即每个部分)。
我的最终目标是 python 字典数组;
[
{'header':'SYNOPSIS', 'text': }
{'header':'PARAMETER', 'text': }
]
header 部分始终锚定在行首,并带有“.”。然后是大写的 TEXT。该部分的 body 包括任何单词和 non-word 个字符,包括 CR/LF(基于 windows)。
不保证 Header 名称是固定的文字,或以特定的顺序排列。我也不知道可能存在多少 header。
现在看起来像这样
(^\.[A-Z]+)([\n\W\w]+)
现在我可以匹配 header 后跟 body,但我很难告诉 REGEX 本质上是 'stop looking when you hit the next .HEADERTEXT'.
我已经创建了一个 Regex101 https://regex101.com/r/YqibeH/4 如果它有用的话(不确定这可能会怎样)。 . .
我的伪代码是这样的,
查找所有以^.[A-Z]开头的行作为捕获组,然后继续匹配header之后的所有文本(多行)作为第二个捕获组。在下一个 header 开始之前停止捕获 ^.[A-Z]
非常感谢任何帮助。
我相信您正在寻找的是向前看。此外,您所做的搜索是贪婪的,应该改为惰性量词。话虽如此。这应该有效。
^\.\w+[\n\W\w]+?(?=^\.\w+|^#>)
https://regex101.com/r/YqibeH/7
^\.\w+
贪婪地捕获你的 header 文字。
[\n\W\w]+?
懒惰地搜索您的 body 文本。
(?=^\.\w+|^#>)
直到它向前看并找到以另一个 header 文本开头的行或以 header 结束标记开头的行。
请注意,如果使用贪婪量词 +
而不是 +?
,它将继续匹配直到它可以匹配的最后一个可能的实例。
text = '<#\n.SYNOPSIS\nThis is the block of code that I would like to have matched along with the .SYNOPSIS header, ' \
'as this block belongs to SYNOPSIS\n .NOTES\n This block needs to belong with\nNOTES ' \
'header\n.SOMEOTHERHEADER\nAnd resulting text\n\n#> '
pattern = "(\.[A-Z]+\n)+"
import re
print(re.split(pattern, text))
如果我没看错你的问题,我用下面的方法解决了。这样你就有了一个列表,其中包含你需要通过清理字符串追加到你的字典中的所有元素,当然。