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

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]\.|$)(零宽度超前断言),该断言仅断言给定文本的存在而未实际匹配它。

08-16 17:10