我的文本包含几个带有元数据的xml块,如下所示:
Block 1
2017-02-01 12:00
<?xml version="1.0" encoding="UTF-8"?>
<block>
<elt>text</elt>
<elt>more text</elt>
<block>
<elt>words</elt>
</block>
</block>
Block 2
2017-02-01 12:15
<?xml version="1.0" encoding="UTF-8"?>
<block>
<block>
<elt>text</elt>
<block>
<elt>words</elt>
</block>
<elt>more text</elt>
</block>
<elt>word</elt>
</block>
我需要提取xml文本并跳过元数据。我可以像这样迭代地做:
messages = []
while True:
start = xml.find('<?xml')
if start == -1:
break
xml = xml[start:]
end = xml.find('\n\n')
if end == -1:
messages.append(xml)
break
else:
messages.append(xml[:end])
xml = xml[end:]
但我想改用正则表达式。我遇到的问题是我需要能够匹配2个连续的换行符(\n\n
)或字符串的末尾(\Z
)。我在那里遇到麻烦。我试过这个:
re.findall('<\?xml.*?[\n\n|\Z]', xml, re.DOTALL)
但我得到['<?xml version="1.0" encoding="UTF-8"?>\n', '<?xml version="1.0" encoding="UTF-8"?>\n']
。
我过去曾使用\b
来匹配单词,但这并没有改变:
>>> re.findall('<\?xml.*?[(\b\n\n\b)|\Z]', xml, re.DOTALL)
['<?xml version="1.0" encoding="UTF-8"?>\n', '<?xml version="1.0" encoding="UTF-8"?>\n']
我无法弄清楚如何让它发挥作用。
答案 0 :(得分:1)
您正在尝试匹配字符类[]
中字符串OR 2换行符的结尾。这不起作用。
我在正向查找中匹配它们(与标准分组括号不同,不使用或创建组,因此findall
返回整个字符串)
re.findall('<\?xml.*?(?=\n\n|\Z)', xml, re.DOTALL)
另一个好的解决方法是匹配最后一个</block>
,从一个新行开始:
re.findall('<\?xml.*?\n</block>', xml, re.DOTALL)