将正则表达式应用于python中的xml文件

时间:2018-12-07 08:21:24

标签: python regex xml python-3.x

我有一个python作业,必须将正则表达式操作应用于XML文件。 具体来说,我必须提取XML文件中的某些部分。例如

<?xml version="1.0" encoding="UTF-8"?>

<.... some xml sections...>

<keyword:ROW field1="value1">
<field2>=value2</field3>
<field3>=value3</field3>
</keyword:ROW>

<keyword:ROW field4="value4">
<field4>=value4</field4>
<field4>=value4</field4>
</keyword:ROW>

在上面的代码示例中,我必须提取以

开头的部分
<keyword:ROW" 

请告诉我如何将re.compile()应用于此问题说明。

3 个答案:

答案 0 :(得分:0)

您可以尝试

<keyword:ROW\s[\w\W]*?<\/keyword:ROW>
  

说明

  • <keyword:ROW-匹配<keyword:ROW
  • \s-匹配空格字符。
  • [\w\W]*?-匹配零个或多个时间的任何字符。(使它变懒)
  • <\/keyword:ROW>-匹配</keyword:ROW>

Demo

答案 1 :(得分:0)

为什么不尝试使用xml模块?

例如。

import xml.etree.ElementTree as ET
tree = ET.parse('example.xml')
root = tree.getroot()

for item in root.findall('keyword:ROW'):
    field2 = country.find('field2').text
    print field2

引用:https://docs.python.org/2/library/xml.etree.elementtree.html

答案 2 :(得分:0)

使用regex解析XML不是一个好主意,因为XML数据可能包含嵌套结构,从而在使用regex解析时会导致意外结果。

尽管对于简单的情况,您可以进行快速而肮脏的工作,但从长远来看,您应该使用XML解析器。仅针对您的情况,您可以使用此正则表达式,

(?s)<keyword:ROW.*?<\/keyword:ROW>

要查找您的<keyword:ROW标签的所有出现

说明:

  • (?s)->启用。匹配换行符,默认情况下不是
  • <keyword:ROW->匹配您想要的关键字
  • .*?->匹配该非贪婪字符,并在<\/keyword:ROW>之前停止
  • <\/keyword:ROW>->匹配结束标签并停止捕获文本

这是您需要的python代码,

import re
s = """
<?xml version="1.0" encoding="UTF-8"?>

<.... some xml sections...>

<keyword:ROW field1="value1">
<field2>=value2</field3>
<field3>=value3</field3>
</keyword:ROW>

<keyword:ROW field4="value4">
<field4>=value4</field4>
<field4>=value4</field4>
</keyword:ROW>
"""

arr = re.findall(r'(?s)<keyword:ROW.*?<\/keyword:ROW>', s)
print(arr)

哪个给出以下输出,基本上是示例XML中存在的两个标签。

['<keyword:ROW field1="value1">\n<field2>=value2</field3>\n<field3>=value3</field3>\n</keyword:ROW>', '<keyword:ROW field4="value4">\n<field4>=value4</field4>\n<field4>=value4</field4>\n</keyword:ROW>']

如果您需要任何说明,请告诉我。