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

2024-06-26 00:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由元素组成的字符串。每个元素可以包含“pear”或“apple”。我可以使用以下方法获取所有元素:

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

但是,我想得到最后一个包含pear的元素。最简单/最快的方法是什么?这是一个好方法:

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)

还是应该改用解析器?你知道吗


Tags: 方法字符串re元素appletagmatchlist
2条回答

使用解析器,例如^{}

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并查找文本与regex pear匹配的所有标记(按字面意思查找“pear”。
a demo on 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的一部分)来完成这项工作。你知道吗

相关问题 更多 >