2017-07-19 36 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