我正在尝试解析以下格式的半结构化文本:
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']
如何修改正则表达式,以使比赛的最后部分不被排除在以后的比赛之外?
由于各小节之间的新行数量可能会发生变化,因此我无法按新行分割。
答案 0 :(得分:3)
使用前瞻性(可选)摆脱捕获组:
>>> 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]\.|$)
(零宽度超前断言),该断言仅断言给定文本的存在而没有实际匹配。
答案 1 :(得分:1)