Python 解析带注释的文件

Python 解析带注释的文件,python,parsing,tags,annotations,Python,Parsing,Tags,Annotations,我正试图解析一个包含表单中人名注释的文件 <name> James Gold </name> said to meet with <name> Mable Helen </name> tomorrow night 詹姆斯·戈尔德 说明天晚上去见Mable Helen 我试图用python正则表达式来实现这一点,但它不起作用。我正在使用 annotation = re.findall(' <name>(.*)</name&

我正试图解析一个包含表单中人名注释的文件

<name> James Gold 

</name> said to meet with <name> Mable Helen  </name> tomorrow night
詹姆斯·戈尔德 说明天晚上去见Mable Helen 我试图用python正则表达式来实现这一点,但它不起作用。我正在使用

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

我想恢复
标记中的所有条目,但这些标记可能位于不同的行上。我尝试连接所有行并删除换行符,但没有效果。有什么想法吗?

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

将lxml.etree作为et导入
xml=”“”
詹姆斯·戈尔德
说明天晚上去见Mable Helen
"""
tree=et.fromstring(xml)
对于tree.xpath(“//name”)中的名称:
打印名称.text.strip()
结果:

James Gold Mable Helen 詹姆斯·戈尔德 梅布尔·海伦
假设它只是一个带注释的文件而不是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']
>src=“”詹姆斯·戈尔德
…说明天晚上见Mable Helen“
>>>
>>>[s.strip()用于re.findall(r'(.*?),src,re.DOTALL)中的s]
['James Gold'、'Mable Helen']

然后只要
strip
结果,如果它碰巧跳过了换行符,就可以得到一个合适的字符串。此外,您的正则表达式缺少
操作符:因此它一直在消耗最后一个
标记之前的所有内容

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

根据他发布的内容,它不一定是xml。是的,文件不是xml。它只是一系列文本,在某些地方带有名称注释。e、 g.凯特,电力营销。你能和马洛里谈谈对方的名字吗?这不是学校的作业。这是我正在做的一个项目。我尝试了lxml,但它在文件上抛出了错误。我猜这是因为文件中有这样的标记,没有结束符。我只需要稍微调整一下我的输入,如果你能控制文件格式,我想这会让生活更轻松。不管怎样祝你好运
re.MULTILINE
仅与
^
$
特殊字符和控件相关,如果这些字符和控件仅与整个字符串或其所有行相关。所以这里似乎不需要它。。。
>>> 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']