2011-03-04 4 views
3

나는 내가 HDF5 형식의 배열을 저장하기 위해 MATLAB의 hdf5write 기능을 활용 these scripts 사용 정규 표현식으로 파이썬 문자열의 16 진수 값을 제거하려면 어떻게해야합니까?

columns = {'MagX', 'MagY', 'MagZ', ... 
      'AccelerationX', 'AccelerationX', 'AccelerationX', ... 
      'AngularRateX', 'AngularRateX', 'AngularRateX', ... 
      'Temperature'} 

MATLAB

에서 셀 배열을 가지고있다.

나는 python을 사용하여 python으로 hdf5 파일을 읽었습니다. 셀 배열은 빈약 한 문자열 배열로 제공됩니다. 목록으로 변환하면 출력됩니다 :

>>>columns 
['MagX\x00\x00\x00\x08\x01\x008\xe6\x7f', 
'MagY\x00\x7f\x00\x00\x00\xee\x0b9\xe6\x7f', 
'MagZ\x00\x00\x00\x00\x001', 
'AccelerationX', 
'AccelerationY', 
'AccelerationZ', 
'AngularRateX', 
'AngularRateY', 
'AngularRateZ', 
'Temperature'] 

이 16 진수 값은 어딘가에서 문자열로 튀어 나오고 제거하고 싶습니다. 그들은 항상 목록의 처음 세 항목에 나타나지는 않습니다. 나는 그것들을 다루거나 그들이 왜 그곳에있는 이유를 알아내는 좋은 방법이 필요합니다.

>>>print columns[0] 
Mag8� 
>>>columns[0] 
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f' 
>>>repr(columns[0]) 
"'MagX\\x00\\x00\\x00\\x08\\x01\\x008\\xe6\\x7f'" 
>>>print repr(columns[0]) 
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f' 

일반 표현식을 사용하여 16 진수 값을 제거했지만 운이별로 없었습니다.

>>>re.sub('(\w*)\\\\x.*', '\1', columns[0]) 
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f' 
>>>re.sub('(\w*)\\\\x.*', r'\1', columns[0]) 
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f' 
>>>re.sub(r'(\w*)\\x.*', '\1', columns[0]) 
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f' 
>>>re.sub('([A-Za-z]*)\x00', r'\1', columns[0]) 
'MagX\x08\x018\xe6\x7f' 
>>>re.sub('(\w*?)', '\1', columns[0]) 
'\x01M\x01a\x01g\x01X\x01\x00\x01\x00\x01\x00\x01\x08\x01\x01\x01\x00\x018\x01\xe6\x01\x7f\x01' 

이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까? 다음과 같은 방법으로 모든 비 단어 문자를 제거 할 수 있습니다

답변

7

:

>>> re.sub(r'[^\w]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f') 
'MagX8' 

정규식 [^\w] 편지가 아닌 임의의 문자와 일치합니다, 숫자 또는 밑줄. re.sub에있는 정규식을 빈 문자열로 대체하면 문자열의 다른 모든 문자가 삭제됩니다.

다른 문자를 유지하려는 경우 더 나은 해결책은 제어 문자를 제외하는 유지하려는 더 큰 문자 범위를 지정하는 것입니다. 예를 들어 :

>>> re.sub(r'[^\x20-\x7e]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f') 
'MagX8' 

아니면 해당하는 [^ -~][^\x20-\x7e]을 대체 할 수는에 따라하면 더 명확한 것 같다.

는이처럼 .*를 추가 할 첫 번째 제어 문자 이후의 모든 문자를 제외하려면 다음

>>> re.sub(r'[^ -~].*', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f') 
'MagX' 
+0

감사합니다,이 간단하고 내가 필요하지 않습니다.^문자는 너무 자주 사용하는 것을 잊어 버리는 것입니다. – moorepants

1

그들은 문자열에 실제로하지 않은 : 당신은 16 진법을 사용하여 이스케이프 제어 문자, 파이썬 디스플레이를 - 그 이유는 값을 인쇄 할 때 특이한 기호를 보게되는 이유입니다.

당신은 단순히 정규 표현식에서 인용의 여분의 수준을 제거 할 수 있어야하지만 당신은 단순히 탭과 공간 이외의 공백 문자 일치하는 정규 표현식 모듈의 일반적인 공백 클래스처럼 뭔가에 의존 수 있습니다

>>> import re 
>>> re.sub(r'\s', '?', "foo\x00bar") 
'foo\x00bar' 
>>> print re.sub(r'\s', '?', "foo\x00bar") 
foobar 

나는 하나의 공간, 비 분리 공백 문자를 포함한 모든 입력 공백 실행을 대체하기 위해이 일을 조금 사용

>>> re.sub(r'[\xa0\s]+', ' ', input_str) 
+0

이스케이프 처리되지 않은 이스케이프 제어 문자를 설명하는 참조를 알고 있습니까? – moorepants

+0

정말 파이썬 문자열의 표준 동작입니다. 문자열에 내용을 표시 할 때 터미널에서 자유롭게 해석 할 수있는 이진 값이 포함될 수 있습니다 (예를 들어, 실수로 이진 데이터를 표시하면 글꼴이 변경되거나 시스템 벨소리가 play). 도움이되지 않고 약간 짜증나게하기 때문에 대화 형 Python 셸은 대신 문자열 대신 표현식을 표시합니다 (예 :'repr (foo)'가 반환 할 내용). 이스케이프 처리를 포함하면 문자열을 올바르게 입력해야합니다 파이썬 소스에서. –

0

당신은 또한 re을 가져 오지 않고이 작업을 수행 할 수 있습니다. 예 :당신이 ASCII 문자 만 유지하는 내용 인 경우 :

good_string = ''.join(c if ord(c) < 129 else '?' for c in bad_string)

관련 문제