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

Wol*_*lfy 113 python regex string escaping

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

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

pyf*_*unc 180

使用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
Run Code Online (Sandbox Code Playgroud)

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

在此重复:

re.escape(串)

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

  • 您可以使用 regex 模块而不是 re。一个例子是`regex.escape(pattern,string,special_only=True` (2认同)

Tim*_*ick 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\"
Run Code Online (Sandbox Code Playgroud)

需要注意的重要事项:

  • 搜索模式中,包括\您正在寻找的字符.你将用它\来逃避你的角色,所以你也需要逃脱 .
  • 例如,在搜索模式周围加上括号([\"]),以便替换 模式可以在它\前面添加时使用找到的字符.(这就是 \1:使用第一个带括号的组的值.)
  • r前面的r'([\"])'意味着它是一个原始字符串.原始字符串使用不同的规则来转义反斜杠.要写([\"])为纯字符串,您需要将所有反斜杠加倍并写入'([\\"])'.在编写正则表达式时,原始字符串更友好.
  • 替换模式中,您需要转义\以将其与替换组之前的反斜杠区分开,例如\1,因此r'\\\1'.要把 写成一个普通的字符串,你需要'\\\\\\1'- 而且没有人想要那样.


dp_*_*dp_ 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" :\\
Run Code Online (Sandbox Code Playgroud)

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

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串是unicode,这不起作用,因为你将拥有你并且应该运行`repr(x)[2:-1]` (3认同)