2014-01-06 42 views
0

我正在使用Python的3.3 re模塊。我想改變一個文件,其中強調一個詞在星號之間放置在另一個文件中,其中同樣強調的標記是'{\ em ...}'(排版系統爲ConTeXt)。Python的re模塊不正確地處理反斜槓

例如句子

Shakespeare wrote *Hamlet*. 

應該轉變成

Shakespeare wrote {\em Hamlet}. 

下面的正則表達式查找並完全提取所需的信息:

>>> import re 
>>> pc_em = re.compile(r'\*(.+?)\*') 
>>> emph = 'Shakespeare wrote *Hamlet*.' 
>>> m = pc_em.search(emph) 
>>> m.group(1) 
'Hamlet' 

但我一直無法找到任何方法來執行最終替換:

>>> pc_em.sub(r'{\em \g<1>}', emph) 
'Shakespeare wrote {\\em Hamlet}.' 
>>> pc_em.sub(r'{\\em \g<1>}', emph) 
'Shakespeare wrote {\\em Hamlet}.' 
>>> pc_em.sub('{\\em \g<1>}', emph) 
'Shakespeare wrote {\\em Hamlet}.' 

有人知道如何在最後一個大括號內獲得一個反斜槓嗎?或者這是一個錯誤?

在此先感謝

帕科

+0

我認爲你的第一個替代品實際上工作正常 - 嘗試'print(pc_em.sub(r'{\ em \ g <1>}',emph))'來查看實際文本,而不是字符串文字表示。 – Marius

+3

提示:無數數千名程序員多年來使用的正則表達式包使用錯誤處理反斜槓的可能性有多大?您是第一個注意到的人嗎?第二個提示:你的第一個猜測太高了;-) –

+0

我沒有觀察到你的結果,無論是在IDLE還是在命令行窗口。你的問題令我困惑。而且,當我做'h = pc_em.sub(r'{\ em \ g <1>}','* H *')'',然後''print h,len(h)''時, {\ em H} 7''。 – eyquem

回答

7

更換工作正常。解釋器正在打印字符串的表示而不是字符串本身,所以反斜槓被轉義。

如果你print(pc_em.sub(r'{\em \g<1>}', emph))你會看到它是正確的。