用正则表达式在Python中解析XML

16

我正在尝试使用正则表达式来解析一个XML文件(在我的情况下,这似乎是最简单的方法)。

例如,一行可能是:

line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>'

为了访问标签"City_State"的文本,我正在使用:

attr = re.match('>.*<', line)

但是什么也没有被返回。

有人能指出我做错了什么吗?


11
我被迫链接这个答案 - johnsyweb
使用适当的XML库并不难,一旦你找到了一个你喜欢的库。我发现ElementTree是标准库中最好用的之一,而untangle则是最简单的(它将XML转换为常规字典/列表等)。 - dbr
当,@Johnsyweb比我先完成了! - torek
有人能指出我哪里做错了吗?A:你正在尝试使用正则表达式解析XML。 - Michael Kay
我之前尝试过使用ElementTree,但是遇到了内存问题。文件大小为250Mb。由于我要解析的XML文件非常简单,所以我认为使用正则表达式更容易些。 - user2671656
显示剩余2条评论
3个回答

22
通常不建议使用 re.match。引用自文档(链接)

如果要在字符串中查找匹配项,请改用 search()(还可参见search() vs. match())。

注意:
>>> print re.match('>.*<', line)
None
>>> print re.search('>.*<', line)
<_sre.SRE_Match object at 0x10f666238>
>>> print re.search('>.*<', line).group(0)
>PLAINSBORO, NJ 08536-1906<

此外,为什么要用正则表达式解析XML,当你可以使用像 BeautifulSoup 这样的工具呢? :)
>>> from bs4 import BeautifulSoup as BS
>>> line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>'
>>> soup = BS(line)
>>> print soup.find('city_state').text
PLAINSBORO, NJ 08536-1906

9

请使用像ElementTree这样的XML解析器

>>> from xml.etree import ElementTree as ET
>>> line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>'
>>> ET.fromstring(line).text
'PLAINSBORO, NJ 08536-1906'

0

如果模式与整个字符串匹配,则 re.match 仅返回匹配项。要查找与模式匹配的子字符串,请使用 re.search。

是的,这是解析 XML 的一种简单方法,但我强烈建议您使用专门设计用于此任务的库。


只有当它真正解析XML时,它才能成为“解析XML的简单方法”。但事实并非如此。(请参见:缺乏检测注释或CDATA块的支持;处理字符实体等等)。 - Charles Duffy
小细节:re.match 左侧锚定但不必消耗整个字符串。非常宽松地说,给定正则表达式 Xre.match 就像使用 ^Xre.search(但不是 ^X$)。还有其他差异,特别是包含换行符的字符串;请参见Haidro's answer中的文档链接。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接