python regex:匹配多行模式中的单词

时间:2017-02-01 19:55:17

标签: python regex

我的文本包含几个带有元数据的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']

我无法弄清楚如何让它发挥作用。

1 个答案:

答案 0 :(得分:1)

您正在尝试匹配字符类[]中字符串OR 2换行符的结尾。这不起作用。

我在正向查找中匹配它们(与标准分组括号不同,不使用或创建组,因此findall返回整个字符串)

re.findall('<\?xml.*?(?=\n\n|\Z)', xml, re.DOTALL)

另一个好的解决方法是匹配最后一个</block>,从一个新行开始:

re.findall('<\?xml.*?\n</block>', xml, re.DOTALL)