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


100

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

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

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

답변:


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

9
파이썬 3과 호환되는 것이 있습니까?
thejinx0r

3
@ thejinx0r : 여기를보세요 : stackoverflow.com/questions/14820429/…
ChristopheD

29
기본적으로 Python3을 위해 당신이 원하는print(b"Hello,\nworld!".decode('unicode_escape'))
ChristopheD

3
Python 3의 경우value.encode('utf-8').decode('unicode_escape')
Casey Kuball

8
경고 : value.encode('utf-8').decode('unicode_escape') 문자열에서 ASCII가 아닌 문자를 손상시킵니다 . 입력에 ASCII 문자 만 포함되도록 보장되지 않는 한 이는 유효한 솔루션이 아닙니다.
Alex Peters 19

35

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

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

이렇게 :

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

3
문자열에 이스케이프 된 세미콜론이 있으면이 코드가 손상됩니다. 구문 오류 "줄 연속 문자 뒤의 예기치 않은 문자"발생
darksky

3
것을 @darksky 통지 ast라이브러리 (중 따옴표를 요구 "하거나 ', 심지어 """또는 '''실제로 파이썬 코드를하지만, 보안 강화 (방지 문자열 주입)로 실행하려고하기 때문에, 당신의 escaped_str 주위)
InQβ

@ no1xsyzy : OP의 경우 이미 해당되는 경우입니다. 이것이 정답이다 strA는 repr(A)의 str또는 bytes영업의 경우와 같이 객체; unicode-escape코덱 대답은 그것의하지 않는 경우입니다 repr만, 탈출 텍스트의 다른 형태는 (문자열 데이터 자체의 일환으로 따옴표로 둘러싸여되지 않음).
ShadowRanger

utf-8 문자를 사용하면 작동하지 않습니다. 코드 패키지로 마지막 답변을 확인하십시오. 실제로 작동합니다.
rubmz

FWIW 이스케이프 된 JSON 텍스트를 구문 분석하려고 시도했지만이 오류가 계속 발생 했으며이 [ERROR] TypeError: string indices must be integers솔루션이이를 해결했습니다. 문자열을 이스케이프 해제 한 다음 JSON으로 구문 분석합니다.
cyber-monk

20

주어진 모든 답변은 일반 유니 코드 문자열에서 중단됩니다. 다음은 내가 말할 수있는 한 모든 경우에 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동안 시간이 발생할 수 있습니다.


ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"Python 3.7.3에서 잘 작동합니다
oldrinb

@oldrinb 댓글 주셔서 감사합니다! 나는 그것을 포함하도록 대답을 편집했습니다.
Jesko Hüttenhain

14

파이썬 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"

2
합치면 value.encode('utf-8').decode('unicode_escape').
Casey Kuball

6
문자열이 일부 UTF-8 ASCII 문자가 아닌 문자 (예 : 폴란드어 문자)가 포함 된 경우이 슬프게 중단됩니다
Pax0r

에 대한 호출에서 폴란드어에 적합한 인코딩을 선택해 보셨습니까 encode?
ASAC

utf-8 문자를 사용하면 작동하지 않습니다. 코드 패키지로 마지막 답변을 확인하십시오. 실제로 작동합니다.
rubmz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.