Python重新findall匹配重复模式

Python重新findall匹配重复模式,python,regex,Python,Regex,我正在尝试解析以下格式的半结构化文本: text = "A. xxxxxxx\n\nxxx\n\nxxx\n\n\nB. xxxxxx\n\nxxx\n\nxxx\n\n\nC. xxxxxx\n\nxxx\n\nxxx\n\n\nD. xxxxxx\n\nxxx\n\nxxx" 我想把这些部分分成不同的组。我目前正在尝试使用正则表达式进行解析,该正则表达式在大写字母和句点之间查找文本: re.findall(r"([A-Z]\.[\s\S]*?)(?:\n[A-Z]\.|$)", text)

我正在尝试解析以下格式的半结构化文本:

text = "A. xxxxxxx\n\nxxx\n\nxxx\n\n\nB. xxxxxx\n\nxxx\n\nxxx\n\n\nC. xxxxxx\n\nxxx\n\nxxx\n\n\nD. xxxxxx\n\nxxx\n\nxxx"
我想把这些部分分成不同的组。我目前正在尝试使用正则表达式进行解析,该正则表达式在大写字母和句点之间查找文本:

re.findall(r"([A-Z]\.[\s\S]*?)(?:\n[A-Z]\.|$)", text)
但是,这仅分析A和C部分:

['A. xxxxxxx\n\nxxx\n\nxxx\n\n', 'C. xxxxxx\n\nxxx\n\nxxx\n\n']
如何修改正则表达式,使匹配的最后一部分不会从将来的匹配中排除


我不能按新行分割,因为子部分之间的新行数可能会有所不同

使用前瞻并有选择地摆脱捕获组:

>>> print re.findall(r"[A-Z]\.[\s\S]*?(?=\n[A-Z]\.|$)", text)
['A. xxxxxxx\n\nxxx\n\nxxx\n\n', 'B. xxxxxx\n\nxxx\n\nxxx\n\n', 'C. xxxxxx\n\nxxx\n\nxxx\n\n', 'D. xxxxxx\n\nxxx\n\nxxx']

注意使用?=\n[A-Z]\.\124;$zero width lookahead断言,该断言仅断言给定文本的存在,而没有实际匹配该文本。

使用lookahead并可选地放弃捕获组:

>>> print re.findall(r"[A-Z]\.[\s\S]*?(?=\n[A-Z]\.|$)", text)
['A. xxxxxxx\n\nxxx\n\nxxx\n\n', 'B. xxxxxx\n\nxxx\n\nxxx\n\n', 'C. xxxxxx\n\nxxx\n\nxxx\n\n', 'D. xxxxxx\n\nxxx\n\nxxx']
请注意使用?=\n[A-Z]\.\124;$zero width lookahead断言,该断言仅断言给定文本的存在,而没有实际匹配它。

尝试此方法

[A-Z]\.[^.]*

虽然这个

m^[A-Z]\.?:^[A-Z]\.[\S\S]*

永远不会失败。

试试这个

[A-Z]\.[^.]*

虽然这个

m^[A-Z]\.?:^[A-Z]\.[\S\S]*

永远不会失败