如何使用带有python的regex从XML文件中删除多个空格和字符?

2024-06-09 12:36:34 发布

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

我在一个XML文件中有数百行,如以下两个示例:

<settings site_id="someID123" xmltv_id="Some text - dummy (2) HH">Some text - dummy (2) HH</settings>
<settings site_id="moreID321" xmltv_id="More Text">More Text</settings>

我想用python regex格式化xmltv\u id=“此处”中的所有内容,不带空格、破折号或括号,并在末尾添加.xx

xmltv_id="Some text - dummy (2) HH"
xmltv_id="More Text"

变成这样

xmltv_id="Sometextdummy2HH.xx"
xmltv_id="MoreText.xx"

我该怎么做?你知道吗

谢谢!你知道吗


Tags: 文件textid示例settingsmorehhsite
3条回答

考虑以下方法—读取和解析xml、修改数据、编写xml。你知道吗

import xml.etree.ElementTree as ET

tree = ET.parse('1.xml')

for element in tree.findall('settings'):
    element.set('xmltv_id', element.get('xmltv_id').replace(' ', ''))

tree.write('2.xml')

原始xml 1.xml

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    <settings site_id="someID123" xmltv_id="Some text - dummy (2) HH">Some text - dummy (2) HH</settings>
</note>

修改的xml 2.xml

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    <settings site_id="someID123" xmltv_id="Sometext-dummy(2)HH">Some text - dummy (2) HH</settings>
</note>

在解析结构化数据(如XML/HTML)时,Regex永远都不是一种健壮且合适的方法。 使用适当的解析器。你知道吗

使用^{}模块和^{}函数:

import xml.etree.ElementTree as ET
import re

root = ET.parse('yourxml.xml').getroot()
pat = re.compile(r'[\s()-]+')    # regex character class for chars to replace

for el in root.findall('settings[@xmltv_id]'):
    el.set("xmltv_id", pat.sub('', el.get("xmltv_id")) + '.xx')

ET.dump(root)

样本输出:

<main>
  <settings site_id="someID123" xmltv_id="Sometextdummy2HH.xx">Some text - dummy (2) HH</settings>
  <settings site_id="moreID321" xmltv_id="MoreText.xx">More Text</settings>
</main>

您可以使用https://docs.python.org/3.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write轻松地将结果elementTree保存到新文件中

我不认为用python中的一个regex就可以做到这一点。我能想到的解决办法是:

import re

def format_line(line):
    m = re.search('(.*xmltv_id=")(.*)(".*)', line)
    stripped_tag = re.sub(' |-|\(|\)','', m.group(2))
    return f'{m.group(1)}{stripped_tag}.xx{m.group(3)}'
>>> format_line('<settings site_id="someID123" xmltv_id="Some text - dummy (2) HH">Some text - dummy (2) HH</settings>')
'<settings site_id="someID123" xmltv_id="Sometextdummy2HH.xx">Some text - dummy (2) HH</settings>'

相关问题 更多 >