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]*
永远不会失败