2011-03-01 68 views
2

我在xml文件上应用了一些正则表达式来查找和替换值。通常它是有效的(我听到声音说“使用xml解析器”,同时我不能)。但是如果值中有一个特殊字符,它就会毁掉所有的东西。Python中正则表达式中的特殊字符问题

想我有一个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”写入文件。这对我来说非常重要吗?

编辑:这里是我的regexs':

搜索:

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) 

,这是替换ing

outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(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> 

难道你想要什么?

+0

这可以帮助我。谢谢。 – savruk 2011-03-01 12:06:35

+0

@savruk谢谢。如果它确实是一个很好的答案,并且是最好的答案,那么可以通过单击三角形下按钮下方的白色人字形按钮来接受它。它会影响25分而不是10分。 – eyquem 2011-03-01 12:15:58

+0

@savruk谢谢。我没有被任何观点所迷惑,但有一些允许在其他答案上被低估而不必担心自己的愚蠢(是的,我做出了愚蠢的回答) – eyquem 2011-03-01 12:30:57

0

我觉得在处理不可预测的数据源时将白名单有效字符列为最好。 因此,除了您正在进行的任何其他正则表达式替换之外,还可以移除任何未列入白名单的内容,例如a-z 0-9:,。 -

查看您的数据并确定适合您任务的白名单。

+0

那么,我所做的是类似的解释。但是必须有一种方法可以在正则表达式中处理它。 – savruk 2011-03-01 08:37:46

+0

所以要使用我的方法,在替换之前,你会做一个正则表达式用''替换所有非白色列出的字符。那么你将不必担心处理当前代码中的任何隐藏或特殊字符。幸运的是,你不必改变你所拥有的任何东西。 – xzyfer 2011-03-01 08:41:40

+0

@savruk

,,,?之间的连接是什么? \ g <1>等的含义是什么?这是什么:denemeasdasd?什么是self.searchPattern? .....? – eyquem 2011-03-01 09:14:23