1

所以这不适用于python的正则表达式:

>>> re.sub('oof', 'bar\\', 'foooof')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "C:\Python27\lib\re.py", line 270, in _subx
    template = _compile_repl(template, pattern)
  File "C:\Python27\lib\re.py", line 257, in _compile_repl
    raise error, v # invalid expression
error: bogus escape (end of line)

我以为我的眼睛在欺骗我,所以我这样做了:

>>> re.sub('oof', "bar\x5c", 'foooof')

得到了同样的东西。我已经搜索并确认人们有这个问题。那么将 repl 视为普通字符串有什么问题呢?是否有其他格式选项可以放置在 repl 中?

4

4 回答 4

3

是的,替换字符串是针对转义字符处理的。从文档

repl 可以是字符串或函数;如果它是一个字符串,则处理其中的任何反斜杠转义。也就是说,\n 转换为单个换行符,\r 转换为回车符,等等。诸如 \j 之类的未知转义将被单独留下。反向引用,例如 \6,被替换为模式中第 6 组匹配的子字符串。

于 2013-04-30T02:58:33.920 回答
3

如果您不希望处理字符串转义,则可以使用 lambda 并且不处理字符串:

>>> re.sub('oof', lambda x: 'bar\\', 'foooof')
'foobar\\'
>>> s=re.sub('oof', lambda x: 'bar\\', 'foooof')
>>> print s
foobar\

但打印时仍会被解释:

>>> re.sub('oof', lambda x: 'bar\r\\', 'foooof')
'foobar\r\\'
>>> print re.sub('oof', lambda x: 'bar\r\\', 'foooof')
\oobar

或者,使用原始字符串:

>>> re.sub('oof', r'bar\\', 'foooof')
'foobar\\'
于 2013-04-30T03:37:51.487 回答
2

使用原始字符串:

re.sub('oof', r'bar\\', 'foooof')

没有r前缀,你需要有双转义的反斜杠:

re.sub('oof', 'bar\\\\', 'foooof')
于 2013-04-30T02:47:18.053 回答
-1

你期望foobar\作为输出吗?如果是这样,re.sub('oof', r'bar\\', 'foooof')那是你需要的;告诉 Python 将后面的r内容视为原始字符串,因此反斜杠被视为反斜杠,而不是作为需要特殊处理以下字符的标志。是文档中的一个部分,更详细地解释了这一点。

于 2013-04-30T02:52:07.140 回答