Escape-строка для корректного выражения Python

Мой вопрос прост. Предположим, у вас есть строка в Python, как это Foo '" \ Bar,

Как правильно преобразовать его в правильное выражение Python, как 'Foo \'" \\ Bar' (так что вы просто можете скопировать и вставить его в интерпретатор Python, и он будет работать)?

Я думал о '"{}"'.format(some replace magic), но должно быть лучшее решение.

2 ответа

Решение

Вы можете использовать unicode_escape кодек; это производит bytes пример:

>>> example = 'Foo \'" \\ Bar'
>>> print(example)
Foo '" \ Bar
>>> print(example.encode('unicode_escape'))
b'Foo \'" \\\\ Bar'
>>> example.encode('unicode_escape')
b'Foo \'" \\\\ Bar'

unicode_escape явно создает допустимые строковые литералы Python:

Создайте строку, которая подходит как литерал Unicode в исходном коде Python

Чтобы вернуться к Unicode, просто декодируйте из ASCII:

>>> print(example.encode('unicode_escape').decode('ascii'))
Foo '" \\ Bar
>>> example.encode('unicode_escape').decode('ascii')
'Foo \'" \\\\ Bar'

В качестве альтернативы используйте repr():

>>> repr(example)
'\'Foo \\\'" \\\\ Bar\''
>>> print(repr(example))
'Foo \'" \\ Bar'

Вернуть строку, содержащую печатаемое представление объекта. Для многих типов эта функция пытается вернуть строку, которая выдаст объект с тем же значением при передаче eval() в противном случае представление представляет собой строку, заключенную в угловые скобки, которая содержит название типа объекта вместе с дополнительной информацией, часто содержащей имя и адрес объекта.

Выход из repr() строки можно вставить прямо обратно в интерпретатор Python без дополнительного форматирования.

Обратите внимание, что repr() а также unicode_escape только кавычки, когда это абсолютно необходимо. Только когда оба стиля цитирования, одиночный и двойной, присутствуют, один из них экранируется:

>>> print(repr('\''))
"'"
>>> print(repr('\"'))
'"'
>>> print(repr('\'"'))
'\'"'

Это именно то, что repr предназначен для:

>>> x = '''Foo '" \ Bar'''
>>> repr(x)
'\'Foo \\\'" \\\\ Bar\''
>>> print(repr(x))
'Foo \'" \\ Bar'
Другие вопросы по тегам