[英]How to remove multiple spaces and characters from a XML files using regex with 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_id =“ HERE ”里面的所有东西,没有空格,破折号或括号,并在末尾添加.xx
xmltv_id="Some text - dummy (2) HH"
xmltv_id="More Text"
变得像这样
xmltv_id="Sometextdummy2HH.xx"
xmltv_id="MoreText.xx"
我该怎么做?
谢谢!
考虑以下方法 - 读取和解析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)时,正则表达式永远不是一种强大而合适的方法。 使用适当的解析器。
使用etree.ElementTree
模块和re.sub
函数:
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中的单个正则表达式完成这个。 我能想到的解决方案是这样的:
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>'
有了re :
import re
xmltv_id1="Some text - dummy (2) HH"
xmltv_id2="More Text"
replace_regex = r'\s|[-]|[(]|[)]'
print(re.sub(replace_regex, '', xmltv_id1) + '.xx'))
print(re.sub(replace_regex, '', xmltv_id2) + '.xx'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.