Как конвертировать экранированные символы в Python? - PullRequest
6 голосов
/ 29 июля 2011

Я хочу преобразовать строки, содержащие экранированные символы, в их обычную форму, так же как и в лексическом парсере Python:

>>> escaped_str = 'One \\\'example\\\''
>>> print(escaped_str)
One \'Example\'
>>> normal_str = normalize_str(escaped_str)
>>> print(normal_str)
One 'Example'

Конечно, скучным способом будет замена всех известных экранированных символов одним на один: http://docs.python.org/reference/lexical_analysis.html#string-literals

Как бы вы реализовали normalize_str() в приведенном выше коде?

Ответы [ 4 ]

19 голосов
/ 29 июля 2011
>>> escaped_str = 'One \\\'example\\\''
>>> print escaped_str.encode('string_escape')
One \\\'example\\\'
>>> print escaped_str.decode('string_escape')
One 'example'

Несколько похожих кодеков доступны , например, rot13 и hex.

Выше приведен Python 2.x, но - как вы сказали (ниже, в комментарии)что вы используете Python 3.x - несмотря на то, что декодировать строковый объект в Юникоде обходно, это все же возможно .Кодек также был переименован в "unicode_escape":

Python 3.3a0 (default:b6aafb20e5f5, Jul 29 2011, 05:34:11) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> escaped_str = "One \\\'example\\\'"
>>> import codecs
>>> print(codecs.getdecoder("unicode_escape")(escaped_str)[0])
One 'example'
6 голосов
/ 29 июля 2011

Я предполагаю, что вопрос действительно:

У меня есть строка, отформатированная так, как если бы она была частью исходного кода Python.Как я могу безопасно интерпретировать это так, чтобы \n внутри строки было преобразовано в новую строку, кавычки ожидались на любом конце и т. Д.?

Попробуйте ast.literal_eval.

>>> import ast
>>> print ast.literal_eval(raw_input())
"hi, mom.\n This is a \"weird\" string, isn't it?"
hi, mom.
 This is a "weird" string, isn't it?

Для сравнения пойдем другим путем:

>>> print repr(raw_input())
"hi, mom.\n This is a \"weird\" string, isn't it?"
'"hi, mom.\\n This is a \\"weird\\" string, isn\'t it?"'
0 голосов
/ 13 октября 2017

SingleNegationElimination уже упоминал об этом, но вот пример:

В Python 3:

>>>escaped_str = 'One \\\'example\\\''
>>>print(escaped_str.encode('ascii', 'ignore').decode('unicode_escape'))
One 'example'
0 голосов
/ 29 июля 2011

Непарные обратные косые черты являются просто артефактами представления и фактически не хранятся внутри.Вы можете вызвать ошибки, если попытаетесь сделать это вручную.

Если вас интересует только удаление обратной косой черты, которой не предшествует нечетное количество обратной косой черты, вы можете попробовать цикл while:

escaped_str = 'One \\\'example\\\''
chars = []
i = 0
while i < len(escaped_str):
    if i == '\\':
        chars.append(escaped_str[i+1])
        i += 2
    else:
        chars.append(escaped_str[i])
        i += 1
fixed_str = ''.join(chars)
print fixed_str

Изучите ваши переменные позже, и вы поймете, почему то, что вы пытаетесь сделать, не имеет смысла.

... Но, к сведению, я почти на 100% уверен "так же, как лексическая Pythonparser "делает это не используя парсер, так сказать.Синтаксический анализатор предназначен для грамматик, которые описывают способ подбора слов друг к другу.

Возможно, вы думаете о проверке лексического содержимого, которое часто задается с помощью регулярных выражений .Синтаксические анализаторы - в целом более сложный и мощный зверь, с которым вы не хотите возиться в целях манипулирования линейными строками.

...