解析带注释的文件

0 投票
3 回答
1486 浏览
提问于 2025-04-17 05:30

我正在尝试解析一个文件,这个文件里面有人的名字注释,格式是这样的:

<name> James Gold 

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

我想用Python的正则表达式来处理这个,但一直没成功。我使用的是:

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

我想提取所有在<name>标签里的内容,但这些标签可能会分布在不同的行上。我试过把所有行连接起来并去掉换行符,但还是没用。有没有什么好主意?

3 个回答

0

我同意Acorn的看法,你应该使用XML解析器。如果你非得用正则表达式(比如这是个学校作业什么的),那么你需要使用re.S这个标志。默认情况下,.这个符号是不会匹配换行符的,而re.S会强制它匹配换行符。不过,这样一来,你的.*组合就会变得贪婪,可能会匹配到比你想要的更多的内容,所以你需要调整一下你的表达式。

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
4

假设这个文件只是一个带注释的文件,而不是XML文件(如果是XML文件,可以使用Acorn的解决方案),你应该使用一些re标志来跳过换行符,并且更好地使用.

>>> 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>标签为止。

撰写回答