我不明白我使用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'
>>>
答案 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”'