Какой правильный строковый литерал для замены python re.sub? - PullRequest
0 голосов
/ 16 мая 2019

Я не понимаю ошибок, которые я получаю с моим регулярным выражением 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'
>>>

1 Ответ

3 голосов
/ 16 мая 2019

Строка r'' делает обратную косую черту просто обратной.Таким образом, r"\u201c" имеет шесть символов: \ u 2 0 1 c.Затем движок регулярных выражений смотрит на эти символы и жалуется: «Я не знаю, что означает обратная косая черта!»

Так что это тот случай, когда вы не хотите использовать r-строку для замены регулярного выражения,потому что вам нужен обратный слеш, чтобы ввести escape-кодировку Unicode.Без префикса r у вас есть односимвольная строка: "\u201c" содержит символ \u201c или фигурную кавычку.

Как вы показали, без префикса r подстановка работает правильно:

>>> re.sub(r'"(.*)"', '\u201c\\1\u201d', '"Quoted String"')
'“Quoted String”'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...