2014-01-23 3 views
2

비 ASCII 문자가 10 진 코드 포인트로 이스케이프 된 행 당 하나의 문자열 파일이 있습니다. 한 예로 라인은 다음과 같습니다문자열에서 10 진수 이스케이프 처리

mj\\195\\164ger

내가

mjäger

생산이 문자열을 처리하고자하는

(이중 백 슬래시가 정확히 인쇄로 파일에 있습니다). 종래, 파이썬 16 진수가 아니라 파이썬은 디코딩 할 수 예를 들어, 위의 문자열을 mj\xc3\xa4ger로 기록 될 것이다 진수 이스케이프 (보다 탈출 사용합니다.

>>> by=b'mj\xc3\xa4ger' 
>>> by.decode('utf-8') 
'mjäger' 

파이썬 그러나, 바로 진수 이스케이프를 인식하지 못합니다

나는 제대로 진수 이스케이프를 생산하기 위해 문자열을 조작하는 방법을 쓴, 그러나이 탈출 자체가 내가 파이썬이 진수가 최종 문자열을 만들 이스케이프 처리 얻을 수있는 방법. 탈출인가?

import re 

hexconst=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"] 
escapes=re.compile(r"\\[0-9]{3}") 
def dec2hex(matchobj): 
    dec=matchobj.group(0) 
    dec=int(dec[1:]) 
    digit1=dec//16 #integer division 
    digit2=dec%16 
    hex="\\x" + hexconst[digit1] + hexconst[digit2] 
    return hex 

line=r'mj\195\164ger' 
print(escapes.sub(dec2hex,line)) #Outputs mj\xc3\xa4ger 

위의 출력을 mj\xc3\xa4ger에서 mjäger으로 변환 할 때 누락 된 마지막 단계는 무엇입니까? 감사!

+0

인쇄 (escapes.sub을 (DEC2HEX, 라인)) 출력 MJ \의 XC3의 \의 xa4ger을 제공하지만, MJ \\ XC3 \\ xa4ger 같이 가게의 기억. 나는 내 대답을 삭제할 것이고, 그것은 Tim과 비슷하다. – WKPlus

답변

0

훨씬 쉽습니다. 다음, 당신은 (UTF-8 인코딩 된 콘텐츠 등) 인코딩 입력 작업 그래서 만약

>>> import re 
>>> line=r'mj\195\164ger' 
>>> def replace(match): 
...  return chr(int(match.group(1))) 

>>> regex = re.compile(r"\\(\d{1,3})") 
>>> new = regex.sub(replace, line) 
>>> new 
'mj\xc3\xa4ger' 
>>> print new 
mjäger 

파이썬 3에서, 문자열, 유니 코드 문자열 : re.sub()는 콜백 함수 대신 인수로 대체 문자열을 취할 수 당신이 bytes입니다 올바른 유형 사용할 필요가 :

>>> line = rb'mj\195\164ger' 
>>> regex = re.compile(rb"\\(\d{1,3})") 
>>> def replace(match): 
...  return int(match.group(1)).to_bytes(1, byteorder="big") 

>>> new = regex.sub(replace, line) 
>>> new 
b'mj\xc3\xa4ger' 
>>> print(new.decode("utf-8")) 
mjäger 
+0

고마워요, 팀, 이건 파이썬 2에서 작동한다는 것을 알지만, 파이썬 3에서는'''mjäger'''를 얻습니다. 그것은 하나의 유니 코드 문자 대신 두 개의 라틴 -1 문자로 분리하여 두 이스케이프를 처리하는 것 같습니다. 어떤 아이디어? – computermacgyver

+0

아, 파이썬 3 태그를 간과했다. 내 사과. 그에 따라 내 대답을 편집했습니다. –

+0

감사합니다, 팀. 정규 표현식을 바이트 객체에 대해 실행할 수 있다는 것을 알지 못했습니다. 그게 훨씬 쉽습니다. 나는 어리석게도 바이트로 파일을 읽는 것을 피하려고했지만, 지금은 바꿨습니다. 모든 것이 잘 작동합니다. 도와 줘서 고마워. – computermacgyver