解析带注释的文件
我正在尝试解析一个文件,这个文件里面有人的名字注释,格式是这样的:
<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>
标签为止。