我在xml文件上应用一些正则表达式来查找和替换值。通常它可以工作。(我听到声音说“使用xml解析器”。同时我不能。)但是如果值中有一个特殊字符,它会破坏一切。
想想我有一个像下面这样的xml文件:
<fieldset>
<idle1>
<value>something\\n</value>
</idle1>
<idle2>
<value>blabla</value>
</idle2>
</fieldset>
如果我尝试替换“<idle2><value>
”节点中的值,则“<idle1><value>
”节点的值将变为“某事物\ n”。当涉及到写入文件时,xml变为:
<fieldset>
<idle1>
<value>something
</value>
</idle1>
<idle2>
<value>blabla</value>
</idle2>
</fieldset>
在搜索和替换中我都使用“r”字符串文字。但它似乎不起作用。我解决了这个问题。对于每次搜索和替换,我将“\ n”替换为“\\n
”,然后将结果写入文件。但它不是一种有效的使用方式。
有什么东西我看不见吗?我只想在文件中写上“\\n
”。这对我来说是不是很想要它?
编辑:这是我的正则表达式:
搜索:
self.searchPattern=(<fieldset>)(.*?)(<idle2>)(.*?)(<value>)(.*?)(</value>)(.*?)(</idle2>)(.*?)(</fieldset>)
替换:
self.replacePattern=`\g<1>\g<2>\g<3>\g<4><value>denemeasdasd\\\\n</value>\g<8>\g<9>\g<10>\g<11>`
这是搜索的python代码:
self.pattern = re.compile(r''''''+self.searchPattern+'''''', flags = re.S | re.U)
这是替换
outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(0)+'''''')
答案 0 :(得分:1)
我不明白你的解释。
Personnaly,我写了这个:
import re
RE = ('(^([ \t]+)<(idle2)>(?:\n|\r\n?)[ \t]+<value>)'
'(.*?)'
'(?=</value>(?:\n|\r\n?)\\2</\\3>)')
print repr(ch),'\n'
print ch
print '\n-------------------------------------------------'
print repr(re.sub(RE,'\\1AAA',ch,flags = re.M)) , '\n'
print re.sub(RE,'\\1-----HHHHHHXXXXXXX-------',ch,flags = re.M)
结果
'<fieldset>\n <idle1>\n <value>something\\n</value>\n </idle1>\n <idle2>\n <value>blabla</value>\n </idle2>\n</fieldset>'
<fieldset>
<idle1>
<value>something\n</value>
</idle1>
<idle2>
<value>blabla</value>
</idle2>
</fieldset>
-------------------------------------------------
'<fieldset>\n <idle1>\n <value>something\\n</value>\n </idle1>\n <idle2>\n <value>AAA</value>\n </idle2>\n</fieldset>'
<fieldset>
<idle1>
<value>something\n</value>
</idle1>
<idle2>
<value>-----HHHHHHXXXXXXX-------</value>
</idle2>
</fieldset>
这是你想要的吗?
答案 1 :(得分:0)
在处理不可预测的数据源以将有效字符列入白名单时,我觉得最好。 因此,除了你正在进行的任何其他正则表达式替换之外,删除任何未列入白名单的内容,即a-z 0-9 :,。 -
查看您的数据并确定适合您任务的白名单。