python re.sub替换的正确字符串文字是什么?

时间:2019-05-15 23:49:56

标签: python regex

我不明白我使用python regex将Unicode字符插入到regex替换中时遇到的错误。下面是简化的示例。

根据documentation,repl参数应为r''字符串文字。但是,如果我对替换参数使用Unicode转义序列,则会得到KeyError。可以在搜索模式中使用它。

我希望了解此错误消息告诉我的内容,因此我可以更好地选择何时将r''''用作替换模式。任何帮助表示赞赏。

Python 3.7.3 (default, Mar 27 2019, 09:23:15) 
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Python shell history and tab completion are enabled.
>>> import re
>>> re.sub(r'"', r'\u201c', '"Quoted String"')
Traceback (most recent call last):
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/sre_parse.py", line 1021, in parse_template
    this = chr(ESCAPES[this][1])
KeyError: '\\u'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 309, in _subx
    template = _compile_repl(template, pattern)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 300, in _compile_repl
    return sre_parse.parse_template(repl, pattern)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/sre_parse.py", line 1024, in parse_template
    raise s.error('bad escape %s' % this, len(this))
re.error: bad escape \u at position 0
>>> re.sub(r'"(.*)"', '\u201c\\1\u201d', '"Quoted String"')
'“Quoted String”'
>>> re.sub(r'"(.*)"', r'\1', '"Quoted String"')
'Quoted String'
>>> re.sub(r'\u201c', '!', '“Quoted String”')
'!Quoted String”'
>>> re.sub(r'\u201c(.*)\u201d', r'"\1"', '“Quoted String”')
'"Quoted String"'
>>> r'\u201c(.*)\u201d'
'\\u201c(.*)\\u201d'
>>> r'"\1"'
'"\\1"'
>>> r'\u201c'
'\\u201c'
>>> r'\u201c\1\u201d'
'\\u201c\\1\\u201d'
>>>

1 个答案:

答案 0 :(得分:3)

一个r''字符串使反斜杠只是反斜杠。因此r"\u201c"有六个字符:\ u 2 0 1 c。然后,正则表达式引擎查看这些字符并抱怨:“我不知道反斜杠-u是什么意思!”

因此,在这种情况下,您不希望使用r字符串进行正则表达式替换,因为您需要使用反斜杠来引入Unicode转义。如果没有r前缀,则只有一个字符的字符串:"\u201c"具有字符\u201c或大括号。

如您所示,在没有r前缀的情况下,替换可以正常工作:

>>> re.sub(r'"(.*)"', '\u201c\\1\u201d', '"Quoted String"')
'“Quoted String”'