2014-03-13 32 views
2

無法找到相應的PEP或Python re模塊中的一個問題。Python對替換文本中十六進制轉義的支持

有誰知道下列是否計劃修復?

regular-expressions.info

Python不支持替換文本 語法十六進制轉義,即使它支持\ XFF和\ uFFFF的字符串常量。

但它實際上支持標準逃逸像\n\r

因此,例如一個不能用十六進制'>'字符替換'<'字符轉義:

>>> import re 
>>> re.sub(r'\x3c', r'\x3e', '\x3c') 
'\\x3e' 

而不是'\\x3e'它應該是'>'

使用逃脫\n正常工作:

>>> re.sub(r'a', r'\n', 'a') 
'\n' 

提前感謝!

UPD:不使用原始字符串不是一個選項。例如,如果模式和替換字符串存儲在配置文件中,那麼如果我在其中寫入\ x3e,讀取時將變爲'\\x3e',而不是'>'

回答

2

我知道的唯一解決方法是不使用替換文本的原始字符串,而是允許普通字符串評估將\x3e設置爲>。這是有效的,因爲正如你所說的,python字符串確實支持這樣的序列。

>>> import re 
>>> re.sub(r'\x3c', '\x3e', '\x3c') 
'>' 

這意味着,在更復雜的替換文本,你需要更多的逃逸,這可能使它的可讀性,但至少它的工作原理。

我不知道是否有任何計劃來改善這一點。我查看了python 3.4 re module(開發中)的現有文檔,但沒有提及包括這種支持。

但是,如果您需要更換更復雜的邏輯,則可以傳遞repl參數re.sub的函數而不是替換文本。

+0

嘿布萊恩,謝謝你的回覆!不使用原始字符串不是一個選項。例如,如果模式和替換字符串存儲在配置文件中,那麼如果我在其中寫入\ x3e,它將在讀取時變爲''\\ x3e'',而不是'>''。 – kishkin

+0

使用函數作爲'repl'參數是一個非常好的功能,謝謝提及。我完全忘了它。無論哪種方式,你應該使用一些方法來將字符串中的十六進制字符的表示轉換爲實際的字符。我想不出使用'eval()'... – kishkin