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.")