在Python字符串中转义正则表达式特殊字符

时间:2010-11-17 08:09:25

标签: python regex string escaping

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

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

6 个答案:

答案 0 :(得分:163)

使用re.escape

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

在此重复:

  

re.escape(字符串)

     

返回字符串,所有非字母数字反向;如果要匹配可能包含正则表达式元字符的任意文字字符串,这非常有用。

答案 1 :(得分:17)

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

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\"

需要注意的重要事项:

  • 搜索模式中,添加\以及您要查找的字符。 你将使用\来逃避你的角色,所以你需要逃脱
  • 将括号括在搜索模式周围,例如([\"]),以便替换 模式可以在它前面添加\时使用找到的字符。 (那是什么 \1确实:使用第一个带括号的组的值。)
  • r前面的r'([\"])'表示它是原始字符串。原始字符串使用不同 转义反斜杠的规则。要将([\"])写为普通字符串,您需要 将所有反斜杠加倍并写入'([\\"])'。原始字符串更友好 你正在写正则表达式。
  • 替换模式中,您需要转义\以将其与a区分开来 在替换组之前的反斜杠,例如\1,因此r'\\\1'。来写 作为普通字符串,你需要'\\\\\\1' - 并且没有人想要它。

答案 2 :(得分:9)

使用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" :\\'

答案 3 :(得分:3)

如上所述,答案取决于您的情况。如果要转义正则表达式的字符串,则应使用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\" :\\

答案 4 :(得分:2)

这并不难:

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\" :\

答案 5 :(得分:2)

如果您只想替换某些字符,可以使用它:

import re

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