Я не понимаю ошибок, которые я получаю с моим регулярным выражением Python для вставки символов Юникода в замену регулярного выражения.Ниже приведены упрощенные примеры.
Согласно документации параметр repl должен быть строковым литералом r''
.Но если я использую escape-последовательность 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'
>>>