[python] 백 슬래시 이스케이프 된 문자열을 이스케이프 해제하는 방법은 무엇입니까?

다른 문자열의 백 슬래시 이스케이프 버전 인 문자열이 있다고 가정합니다. 파이썬에서 문자열을 이스케이프 해제하는 쉬운 방법이 있습니까? 예를 들어 다음과 같이 할 수 있습니다.

>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>> 

그러나 보안 위험이있는 eval ()에 (신뢰할 수없는) 문자열을 전달하는 것이 포함됩니다. 표준 lib에 문자열을 가져와 보안에 영향을 미치지 않는 문자열을 생성하는 함수가 있습니까?



답변

>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"


답변

ast.literal_eval안전한 것을 사용할 수 있습니다 .

Python 표현식이 포함 된 표현식 노드 또는 문자열을 안전하게 평가합니다. 제공된 문자열 또는 노드는 다음 Python 리터럴 구조로만 구성 될 수 있습니다 : 문자열, 숫자, 튜플, 목록, dicts, 부울 및 없음. (종료)

이렇게 :

>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!


답변

주어진 모든 답변은 일반 유니 코드 문자열에서 중단됩니다. 다음은 내가 말할 수있는 한 모든 경우에 Python3에서 작동합니다.

from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)

주석에 설명 된대로 다음과 같이 모듈 의 literal_eval메서드를 사용할 수도 있습니다 ast.

import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))

또는 문자열에 실제로 문자열 리터럴 (따옴표 포함) 포함 된 경우 다음과 같이됩니다 .

import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))

그러나 입력 문자열이 큰 따옴표 또는 작은 따옴표를 구분 기호로 사용하는지 확실하지 않거나 제대로 이스케이프 될 수 없다고 가정 할 수없는 경우 인코딩 / 디코딩 방법이 계속 작동 literal_eval하는 SyntaxError동안 시간이 발생할 수 있습니다.


답변

파이썬 3에서는 str객체에 decode메서드 가 없으며 객체 를 사용해야 bytes합니다. ChristopheD의 답변은 파이썬 2를 다룹니다.

# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")

# or directly
my_bytes = b"Hello,\\nworld"

print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"


답변