2011-03-01 40 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