我有一个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()应用于此问题说明。
答案 0 :(得分:0)
您可以尝试
<keyword:ROW\s[\w\W]*?<\/keyword:ROW>
说明
<keyword:ROW
-匹配<keyword:ROW
。\s
-匹配空格字符。[\w\W]*?
-匹配零个或多个时间的任何字符。(使它变懒)<\/keyword:ROW>
-匹配</keyword:ROW>
答案 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>']
如果您需要任何说明,请告诉我。