2012-01-21 2 views
12

우분투에서 sensors 유틸리티의 출력을위한 간단한 정규식 파서를 작성하고 있습니다. 여기에 내가 분석하고있어 텍스트 행의 예 :(유니 코드) 학위 기호를 정규식으로 이식 가능하게 구문 분석하는 방법은 무엇입니까?

temp1:  +31.0°C (crit = +107.0°C) 

는 그리고 여기 그 (파이썬)에 맞게 사용하고 정규식입니다 :

temp_re = re.compile(r'(temp1:)\s+(\+|-)(\d+\.\d+)\W\WC\s+' 
        r'\(crit\s+=\s+(\+|-)(\d+\.\d+)\W\WC\).*') 

가이 코드는 예상과 일치 작품으로는 위에 주어진 예제 텍스트. 내가 정말 관심있는 유일한 비트는 숫자, 그래서이 비트 :

+ 또는 - 기호를 일치시켜 시작하고 °C을 일치시켜 종료
(\+|-)(\d+\.\d+)\W\WC 

.

제 질문은 이 아닌 \W (영숫자가 아닌) 문자 두 개가 왜 어울리는 것일까 요? 유니 코드가 광산과 다르게 표현되는 시스템에서 코드가 깨지십니까? 그렇다면 어떻게 휴대 할 수 있습니까?

+2

're.UNICODE' 플래그 – netvope

+0

RE가'\ W \ WC' 또는'\ WC'와 일치하지 않는're.UNICODE' 플래그로 시도하십시오. 아니면 내가 너를 오해 했니? – snim2

+1

섭씨를 의미하는 _single_ 문자 인 "℃"도 있습니다. 고마워, 유니 코드 컨소시엄! –

답변

8

가능한 휴대용 솔루션 :

변환 입력 유니 코드 데이터, 정규 표현식에 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()) 

잘못된 결과를 얻을 수 : 'В°' 대신 °.

입력 데이터의 인코딩을 알아야 할 경우가 있습니다.

+0

물론, 이런 종류의 작업에 대한 완전한 예제는 항상 좋은 아이디어입니다. 전체 기능을 사용할 수있는 경우에도 많은 프로그래머가 유니 코드를 올바르게 처리하는 것은 어렵습니다. ( –

+0

+1 : "입력 데이터를 유니 코드로 변환".btw의 경우이 경우 're.UNICODE'없이 동일한 출력을 얻습니다. – jfs

+0

"진짜"코드에서 실제로 데이터는 유니 코드가 아닌 ASCII로 데이터를 반환하는'subprocess.check_output' 호출의 결과에서옵니다. – snim2

관련 문제