Подтвердить что ты не робот

Кастинг необработанных строк python

Учитывая переменную, которая содержит строку, есть ли быстрый способ преобразовать ее в другую переменную?

Следующий код должен иллюстрировать то, что я после:

line1 = "hurr..\n..durr"
line2 = r"hurr..\n..durr"

print(line1 == line2)  # outputs False
print(("%r"%line1)[1:-1] == line2)  # outputs True

Самым близким, что я обнаружил, является флаг форматирования %r который, кажется, возвращает необработанную строку, хотя и в одинарных кавычках. Есть ли более простой способ сделать это?

4b9b3361

Ответ 1

Python 3:

"hurr..\n..durr".encode('unicode-escape').decode()

Python 2:

"hurr..\n..durr".encode('string-escape')

Ответ 2

Еще один способ:

>>> s = "hurr..\n..durr"
>>> print repr(s).strip("'")
hurr..\n..durr

Ответ 3

Выше было показано, как кодировать.

'hurr..\n..durr'.encode('string-escape')

Этот способ будет декодироваться.

r'hurr..\n..durr'.decode('string-escape')

Исх.

In [12]: print 'hurr..\n..durr'.encode('string-escape')
hurr..\n..durr

In [13]: print r'hurr..\n..durr'.decode('string-escape')
hurr..
..durr

Это позволяет "лить/преобразовывать необработанные строки" в обоих направлениях. Практический пример: когда json содержит необработанную строку, и я хочу хорошо ее распечатать.

{
    "Description": "Some lengthy description.\nParagraph 2.\nParagraph 3.",
    ...
}

Я бы сделал что-то вроде этого.

print json.dumps(json_dict, indent=4).decode('string-escape')

Ответ 4

>>> v1 = 'aa\1.js'
>>> re.sub(r'(.*)\.js', repr(v1).strip("'"), 'my.js', 1)
'aa\\x01.js

Но

>>> re.sub(r'(.*)\.js', r'aa\1.js', 'my.js', 1)
'aamy.js'

и

>>> re.sub(r'(.*)\.js', raw(v1), 'my.js', 1)
'aamy.js'

И улучшенная реализация исходного кода

def raw(text):
    """Returns a raw string representation of text"""
    return "".join([escape_dict.get(char,char) for char in text])