【问题标题】:applying regex to xml file in python在python中将正则表达式应用于xml文件
【发布时间】:2018-12-07 08:21:23
【问题描述】:

我有一个 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() 应用到这个问题陈述中。

【问题讨论】:

    标签: python regex xml python-3.x


    【解决方案1】:

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

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

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

    查找所有出现的&lt;keyword:ROW 标签

    说明:

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

    这是你需要的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>']
    

    如果您需要这里的任何解释,请告诉我。

    【讨论】:

    • 你会推荐我使用 ETree 之类的 API 吗?
    • 是的ETree 是解析此类递归结构的更好选择,您可能想探索lxml 一个第三方库,它甚至提供更多功能甚至Beautiful Soup
    【解决方案2】:

    你可以试试这个

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

    解释

    • &lt;keyword:ROW- 匹配 &lt;keyword:ROW
    • \s - 匹配空格字符。
    • [\w\W]*? - 匹配任何字符零次或多次。(?让它变得懒惰)
    • &lt;\/keyword:ROW&gt; - 匹配 &lt;/keyword:ROW&gt;

    Demo

    【讨论】:

    • 请分享任何有用的链接,这些链接为初学者从基础到高级教授 Python 中的正则表达式。
    【解决方案3】:

    为什么不试试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

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2020-08-16
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      相关资源
      最近更新 更多