2017-07-19 72 views
0

我知道這在其他地方已經介紹過,但我的使用案例給我造成了困難。Python re.sub給出錯誤:無效的組參考

如果什麼字符串有一個可怕的「\ 3」字像這樣的:

new_data = r'C:\temp\3_times.csv' 

...然後重新「認爲」,你指的是它作爲一個羣體,所以如果你嘗試利用這些數據,那麼你得到這個錯誤做了子:

newfiledata = re.sub(old_data,new_data,filedata) 

error: invalid group reference 

有什麼辦法避免這種錯誤,而不要找的字符串在這種情況下,直接修改它傳遞之前,這將需要大量的額外代碼。

注意:對於用法,我打算使用轉義字符修改字符串不是一個選項,因爲我需要稍後使用子函數寫入字符串。所以這不是關於如何轉義特殊字符的問題的重複。

+4

在任何正則表達式中,文字反斜槓必須轉義。作爲一個正則表達式,它將是'r'C:\\ temp \\ 3_times \ .csv''你應該做的是從你的正則表達式字面值中提取元字符。你可以使用'r'([。^#| * +?()\ [\] {} \\ - ])''替換爲'\\ $ 1' – sln

+0

@sln不會'r'製作它是一個原始的字符串,並使它不必逃避你的斜槓?或者是不是這樣? – jacoblaw

+0

@jacoblaw - 這是你傳遞給正則表達式的引擎。所有文字元字符都必須轉義。 – sln

回答

1

你可以簡單地使用re.escape()

import re 
new_data = re.escape('C:\temp\3_times.csv') 

...這轉義特殊字符,請參閱https://docs.python.org/2/library/re.html以獲取更多信息。

+0

'返回字符串與所有非字母數字反斜槓'我不會使用這個。它相當於'\ W',可以轉義所有的元字符,但也可以轉義控制,空白和可能是大量的Unicode。 – sln

+0

這將返回:'C \\:\\\ temp \\\ x03_times \\。csv'...它用於轉義元字符的目的,但是因爲它修改了字符串,它違背了將它與子方法來寫入數據。 – sparrow