Python转义正则expression式的特殊字符

Python是否有一个函数可以用来转义正则expression式中的特殊字符?

例如, I'm "stuck" :\应该成为I\'m \"stuck\" :\\

使用re.escape

 re.escape(string) >>> re.escape('\ a.*$') '\\\\\\ a\\.\\*\\$' >>> print(re.escape('\ a.*$')) \\\ a\.\*\$ >>> re.escape('www.stackoverflow.com') 'www\\.stackoverflow\\.com' >>> print(re.escape('www.stackoverflow.com')) www\.stackoverflow\.com 

请参阅: http : //docs.python.org/library/re.html#module-contents

在这里重复:

re.escape(串)

返回所有非字母数字的string; 如果你想匹配一个可能有正则expression式元字符的任意文字string,这是非常有用的。

我很惊讶没有人提到通过re.sub()使用正则expression式:

 import re print re.sub(r'([\"])', r'\\\1', 'it\'s "this"') # it's \"this\" print re.sub(r"([\'])", r'\\\1', 'it\'s "this"') # it\'s "this" print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"') # it\'s\ \"this\" 

重要的事情要注意:

  • search模式中,包含\以及您正在查找的字符。 你将会使用\来逃避你的angular色,所以你也需要逃避。
  • search模式的周围放置括号,例如([\"]) ,以便replace模式可以使用find的字符加上前面的\ (这就是\1所做的:使用第一个加括号的组的值。 )
  • r'([\"])'前面的r'([\"])'表示它是一个原始string ,原始string使用不同的规则来转义反斜杠,为了将([\"])写成一个普通的string,你需要把所有的反斜杠并写'([\\"])' 。原始string在编写正则expression式时更友好。
  • replace模式中,您需要转义\以区分replace组之前的反斜杠,例如\1 ,因此r'\\\1' 。 要把写成一个普通的string,你需要'\\\\\\1' – 而且没有人愿意这样做。

使用repr()[1:-1]。 在这种情况下,双引号不需要被转义。 [-1:1]切片是从开始和结束删除单引号。

 >>> x = raw_input() I'm "stuck" :\ >>> print x I'm "stuck" :\ >>> print repr(x)[1:-1] I\'m "stuck" :\\ 

或者,也许你只是想逃避短语粘贴到您的程序? 如果是,请执行以下操作:

 >>> raw_input() I'm "stuck" :\ 'I\'m "stuck" :\\' 

如上所述,答案取决于你的情况。 如果你想为正则expression式转义string,那么你应该使用re.escape()。 但是,如果你想逃避特定的字符集,然后使用这个lambda函数:

 >>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s) >>> s = raw_input() I'm "stuck" :\ >>> print s I'm "stuck" :\ >>> print escape(s, "\\", ['"']) I'm \"stuck\" :\\ 

这并不难:

 def escapeSpecialCharacters ( text, characters ): for character in characters: text = text.replace( character, '\\' + character ) return text >>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' ) 'I\\\'m \\"stuck\\" :\\' >>> print( _ ) I\'m \"stuck\" :\ 

如果你只想replace一些字符,你可以使用这个:

 import re print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")