首页 > 解决方案 > 使用正则表达式 (Python) 查找和添加缺失的子字符串

问题描述

我有一个字符串格式的 XML,看起来或多或少像这样:

<item>  
    <property 1> value </property 1>
    <property 2> value </property 2>
    <property 3> value </property 3>
</item>

<item>  
    <property 1> value </property 1>
    <property 2> value </property 2>
    <property 3> value </property 3>
    <property 4> value </property 4>
</item>

正如您在此示例中看到的,第一个item缺少property 4. 我想做的是找到所有item缺少的property 4并手动添加。

这是一个更大的 Python 脚本的一部分,我尝试使用正则表达式方法 re.findall 和 re.search 来查找所有丢失的子字符串,然后使用 re.sub 添加所述子字符串,但我根本无法让它工作.

任何帮助将不胜感激:)谢谢

标签: pythonregexpython-3.x

解决方案


甚至不必为正则表达式解决方案而烦恼。由于 XML 是一种非常规语言,因此正则表达式解决方案注定会失败(如果不是今天,那么明天,只要 XML 字符串发生变化)。

使用适当的 XML 工具并搜索所需的标记。如果缺少,请添加它。您只需要确保您的输入字符串采用有效的 XML 格式(这意味着一个根元素并且标签名称中没有空格)。

from xml.etree import ElementTree as ET

xml_str = '''<root>
                <item>
                    <property_1> value </property_1>
                    <property_2> value </property_2>
                    <property_3> value </property_3>
                </item>
                <item>
                    <property_1> value </property_1>
                    <property_2> value </property_2>
                    <property_3> value </property_3>
                    <property_4> value </property_4>
                </item>
             </root>'''

xml = ET.fromstring(xml_str)
for item in xml.iter('item'):
    prop_4 = item.find('property_4')
    if prop_4 is None:
        prop_4 = ET.Element('property_4')
        prop_4.text = ' value '
        item.append(prop_4)
print(ET.tostring(xml).decode())

#  <root>
#      <item>
#          <property_1> value </property_1>
#          <property_2> value </property_2>
#          <property_3> value </property_3>
#          <property_4> value </property_4>
#      </item>
#      <item>
#          <property_1> value </property_1>
#          <property_2> value </property_2>
#          <property_3> value </property_3>
#          <property_4> value </property_4>
#      </item>
#  </root>

推荐阅读