简单 xml 字符串的简单正则表达式



我有一个由元素组成的字符串。每个元素都可以包含"梨"或"苹果"。我可以使用以下命令获取所有元素:

s = '<tag>uTSqUYRR8gapple</tag><tag>K9VGTZM3h8</tag><tag>pearTYysnMXMUc</tag><tag>udv5NZQdpzpearz5a4oS85mD</tag>'
import re; re.findall("<tag>.*?</tag>", s)

但是,我想获取包含梨的最后一个元素。最简单/最快捷的方法是什么?这是个好方法吗:

list = re.findall("<tag>.*?</tag>", s)
list.reverse()
last = next(x for x in list if re.match('.*pear', x))
re.match('<tag>(.*)</tag>', last).group(1)

还是我应该改用解析器?

使用解析器,即BeautifulSoup

import re
from bs4 import BeautifulSoup
s = '<tag>uTSqUYRR8gapple</tag><tag>K9VGTZM3h8</tag><tag>pearTYysnMXMUc</tag><tag>udv5NZQdpzpearz5a4oS85mD</tag>'
soup = BeautifulSoup(s, "html5lib")
tags = soup.find_all(text=re.compile(r'pear'))
print tags
# [u'pearTYysnMXMUc', u'udv5NZQdpzpearz5a4oS85mD']

这将设置 dom 并查找您的文本与正则表达式pear匹配的所有标签(从字面上查找"梨")。
ideone.com 上观看演示

使用适当的 XML 库将允许您使用 XPath 来封装您的查询。例如:

s = '<root><tag>uTSqUYRR8gapple</tag><tag>K9VGTZM3h8</tag><tag>pearTYysnMXMUc</tag><tag>udv5NZQdpzpearz5a4oS85mD</tag></root>'
import lxml.etree
root = lxml.etree.fromstring(s)
result = root.xpath('//tag[contains(., "pear")][last()]/text()')

。对于给定的输入数据,result将包含['udv5NZQdpzpearz5a4oS85mD'] .在这种情况下,您不需要在自己的代码中搜索最后一项,但可以依靠 XPath 引擎(在 C 中实现,作为 libxml 的一部分)来为您执行此操作。

最新更新