递归提取两个字符串Regex、Python和XML之间的多行数据

2024-06-25 22:54:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的XML文件,我需要从中获取特定条目的数据。文件结构为:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE stuff>
<?xml-stylesheet href="file:///usr/local/test.xsl" type="text/xsl"?>
<!-- 127.0.0.1 -->
<opentag>
<tag1><XXXX YYYY VVV SSS></tag1>
<tag2>
<test>aaa_string_bbb_ccc</test>
</tag2>  
<debugging level="0"/>
</opentag>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<?xml-stylesheet href="file:///usr/local/test.xsl" type="text/xsl"?>
<!-- 192.168.10.1 -->
<opentag>
<tag1><DDD FFF BBB></tag1>
<tag2>
<test>zzz_number_yyy_xxxx</test>
</tag2>
<debugging level="0"/>
</opentag>

在我的XML中,我有很多这样的条目。 我要实现的是提取某些条目的所有行(完整记录)。 我需要创建不同的xml文件,每次您在 <?xml version="1.0" encoding="UTF-8"?> 直到下一个 </opentag>。在

在本例中,我希望有两个不同的xml文件,具有不同的文件名。例如:

1->127.0.0.1.xml:

^{pr2}$

第二个是:

2->192.168.10.1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<?xml-stylesheet href="file:///usr/local/test.xsl" type="text/xsl"?>
<!-- 192.168.10.1 --> 
<opentag>
<tag1><DDD FFF BBB></tag1>
<tag2>
<test>zzz_number_yyy_xxxx</test>
</tag2>
<debugging level="0"/>
</opentag>

什么是正则表达式来为特定条目执行这种记录提取? 有没有其他的Python式的方法来达到这个目的? 我很感激你在这方面的帮助。在

作为


Tags: 文件test目的versionxmldoctypeutfencoding
2条回答

假设所有文件的格式都相同,<! 127.10.10.1 >实际上在第一个可以使用的文件中itertools.groupby要将部分分组:

from itertools import groupby

with open("your_file") as f:
   grps = groupby(f, key=lambda x: x.strip().startswith('<?xml version>'))
   for k, v in grps:
      if k:
          lines = list(v) + list(next(grps)[1])
          with open("{}".format(lines[2]), "w") as out:
              out.writelines( lines)

对于您的示例数据,它可以准确地为您提供所需的信息。在

不要为此使用regex。而是看看ElementTree模块。这样,您就可以迭代所有的opentags,然后将每个opentags写入一个不同的文件。这比使用regex更像python('不要重新发明轮子)。在

如果必须使用regex,可以执行以下操作:

(<\?xml version="1\.0" encoding="UTF-8"\?>.+?<\/opentag>)

确保传递's'修饰符,使'.'与换行符匹配。在

这是最终解决方案:

^{pr2}$

相关问题 更多 >