Python 3.7 с регулярными выражениями: почему я больше не могу заменить строку, содержащую обратную косую черту (\)? - PullRequest
3 голосов
/ 06 октября 2019

Для моей проблемы у меня есть очень простой пример:

import re
my_string = re.sub(r"Hello", r"\Greetings", "Hello Folks!")
print(my_string)

Выше, в Python 3.6, выведите \Greetings Folks! в стандартный вывод. Давайте попробуем это снова в Python 3.7.0 или 3.7.4 (версии, которые я смог протестировать). Что происходит? Мы получаем ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.7/re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/usr/lib/python3.7/re.py", line 309, in _subx
    template = _compile_repl(template, pattern)
  File "/usr/lib/python3.7/re.py", line 300, in _compile_repl
    return sre_parse.parse_template(repl, pattern)
  File "/usr/lib/python3.7/sre_parse.py", line 1024, in parse_template
    raise s.error('bad escape %s' % this, len(this))
re.error: bad escape \G at position 0

Почему это? Есть ли изменения в Python 3.7, которые я пропустил? Как правильно обойти эту проблему?

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Да, произошли изменения. Из документов о re.sub:

Изменено в версии 3.7 : неизвестные экранирования в repl , состоящие из '\' ибуквы ASCII теперь являются ошибками.

Так что просто удвоите обратную косую черту:

my_string = re.sub(r"Hello", r"\\Greetings", "Hello Folks!")
0 голосов
/ 06 октября 2019

Полагаю, вы используете конструкцию \G, которую вы, вероятно, могли бы использовать, если бы установили модуль regex. Либо удалите это, либо добавьте еще одну обратную косую черту.

import re
my_string = re.sub(r"Hello", r"\\Greetings", "Hello Folks!")
print(my_string)

Альтернатива:

$pip install regex

или

$pip3 install regex

Тогда

import regex
my_string = regex.sub(r"Hello", r"\Greetings", "Hello Folks!")
print(my_string)

Выход

\Greetings Folks!
...