가능한 휴대용 솔루션 :
변환 입력 유니 코드 데이터, 정규 표현식에 re.UNICODE
플래그를 사용합니다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
data = u'temp1: +31.0°C (crit = +107.0°C)'
temp_re = re.compile(ur'(temp1:)\s+(\+|-)(\d+\.\d+)°C\s+'
ur'\(crit\s+=\s+(\+|-)(\d+\.\d+)°C\).*', flags=re.UNICODE)
print temp_re.findall(data)
출력
[(u'temp1:', u'+', u'31.0', u'+', u'107.0')]
@netvope 편집는 allready 질문에 대한 의견이 지적했다. 입력 인코딩에 대한 J.F. Sebastian 의견에서
업데이트
주 :
check_output()
반환 때때로 텍스트가 될 수있는 바이너리 데이터 (즉,이 경우의 알려진 문자 인코딩을해야하고 당신이 그것을 변환 할 수 있습니다 유니 코드로). 어쨌든 ord (u '°') == 176이므로 ASCII 인코딩을 사용하여 인코딩 할 수 없습니다.
그래서, 기본적으로 * 당신이 locale.getpreferredencoding()
를 사용하여 시스템 로케일에서 인코딩을 사용한다 unicode
에 입력 데이터를 디코딩 예 : 데이터와
data = subprocess.check_output(...).decode(locale.getpreferredencoding())
제대로 인코딩 :
당신이 얻을 것이다 이 경우 re.UNICODE가없는 동일한 출력. 이유는 기본적으로
?때문에 cp1251
러시아어 Win7에에서와 preferredencoding
우리는 utf-8
출력의 디코딩 예를 script.py
에 대한 경우 :
#!/usr/bin/env python
# -*- coding: utf8 -*-
print u'temp1: +31.0°C (crit = +107.0°C)'.encode('utf-8')
그리고 출력의 구문 분석 꼬마 필요 :
subprocess.check_output(['python',
'script.py']).decode(locale.getpreferredencoding())
잘못된 결과를 얻을 수 : 'В°'
대신 °
.
입력 데이터의 인코딩을 알아야 할 경우가 있습니다.
're.UNICODE' 플래그 – netvope
RE가'\ W \ WC' 또는'\ WC'와 일치하지 않는're.UNICODE' 플래그로 시도하십시오. 아니면 내가 너를 오해 했니? – snim2
섭씨를 의미하는 _single_ 문자 인 "℃"도 있습니다. 고마워, 유니 코드 컨소시엄! –