解析带注释的文件

时间:2011-11-02 15:13:36

标签: python parsing tags annotations

我正在尝试解析包含

形式的人名注释的文件
<name> James Gold 

</name> said to meet with <name> Mable Helen  </name> tomorrow night

我正在尝试使用python正则表达式,但它无法正常工作。我正在使用

annotation = re.findall(' <name>(.*)</name>', lines)

我想恢复<name>标记内的所有条目,但这些标记可能位于不同的行上。我尝试连接所有行并删除换行符,但无济于事。任何想法?

3 个答案:

答案 0 :(得分:4)

假设它只是一个带注释的文件而不是XML文件(在这种情况下使用Acorn的解决方案),您应该使用一些re标志来跳过换行符并更好地使用.:< / p>

>>> src = """<name> James Gold
... </name> said to meet with <name> Mable Helen  </name> tomorrow night"""
>>>
>>> [s.strip() for s in re.findall(r'<name>(.*?)</name>', src, re.DOTALL)]
['James Gold', 'Mable Helen']

然后只有strip结果才能获得正确的字符串,如果碰巧跳过换行符。此外,您的正则表达式错过了?运算符:因此它消耗了最后一个</name>标记的所有内容。

答案 1 :(得分:3)

如果要解析的内容是XML,则不应使用正则表达式。使用lxml等解析器。

import lxml.etree as et

xml="""
<root>
<name> James Gold

</name> said to meet with <name> Mable Helen </name> tomorrow night
</root>
"""

tree=et.fromstring(xml)

for name in tree.xpath("//name"):
    print name.text.strip()

<强>结果:

James Gold
Mable Helen

答案 2 :(得分:0)

我同意Acorn,你应该使用XML解析器。如果您必须使用正则表达式(如果它是学校作业或其他东西),您将需要使用re.S标志。的。默认情况下,运算符与换行符不匹配。 re.S将强制它匹配换行符。但是你的。*组合是贪婪的,并且比你想要的更多,所以你必须调整你的表达。