2012-11-29 3 views
0
의 라인 교체 및 검색 헥사은

문제는 다음과 같다 :
다음과 같이 내가 선 같은 file.read (100)과 점점 뭔가를하고 있어요 :파이썬

line='1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000' 

내가 원하는 것은 이 행에서 16 진수를 검색하고 새로 조작 된 행을 출력하도록 변환하십시오.
그래서 기본적으로 내가하고 싶은 것 :

t=re.findall(r'[\x80-\xff]', line) #Somehow get the positions  
for i in t: ord(i) #Something to this effect to replace all the hexadecimals it finds 

, 내가 라인에서 혼자 자신의 위치를 ​​수 있도록 모든 문자를 찾을 수 없습니다 내가 t에 대해 가지고있는 코드를 사용.
누구든지이 문제에 최선의 방법을 생각해 본다면 궁금합니다. 감사.

+0

단계를 백업하고 해당 입력이 적합한 지 묻는 것이 좋습니다. 잘못된 인코딩으로 파일을 읽으려고하는 것 같습니다. –

+0

파일은 .dat.gz입니다. 유닉스에서는 ^^ 등의 특수 문자가 많이 있습니다. 독서를하는 유일한 방법은 gzip을 사용하고 읽는 것입니다. 인코딩에 대한 더 이상의 생각이 있습니까? – FancyDolphin

+0

'\ x80- \ xff' 범위의 문자를 찾고 있지만 문자열의 문자가'\ x01- \ x1f' 범위에 있습니다. 정규 표현식 파서가 어떻게 처리 할 지 모르겠지만 시작해야 할 곳입니다. –

답변

0

참고 문자 \x 모든 인덱스를 찾을 (뿐만 아니라 수 [0] [LEN (t) - 1], 그리스트를 반복하여 i에서 위해 ord(t[i:i+1]) 같이 두 쌍의 관통 슬라이스 LEN (t)는

+0

내 경험으로 검색을 실행했으며 문자 ('\ x')의 색인은 ValueError : invalid \ x 이스케이프를 제공합니다. 줄의 모든 16 진수 목록을 얻을 수 있다면 목록에있는 항목을 검색하고 줄을 바꿀 수 있다고 생각합니다. 그러나 문제는 파이썬이 16 진수를 올바르게 찾지 못한다는 것입니다. – FancyDolphin

+0

아하, 역 슬래시 문자는 이스케이프입니다. 문자열 ""\ x "'을 만들려면's \\ x \\ '' –

+0

@ nair.ashvin을 입력하고 싶습니다. 와 함께, 그는 현재 가지고있는 문제가 아닙니다. – kreativitea

1

\x 잘못된 탈출이다 이스케이프 X입니다. 귀하의 문제는 정규식 아니다, 그것은 당신이 당신의 line 리터럴 문자열이 아닌 encoding--입니다. 당신이 볼 수 line을 보내고 print 시도 다음

117=0000000054=80300A0050=156=2008080106010414247=CD6=In5=Boot180=0.445179=0.38055=AAA57=2008080100000000212=5000213=20000115=50029=5T2lqZHNAwg=17=00000000 

가능성, 이것은 당신이 필요로하는 무엇을 쉬에서. 오트, 16 진수 값은 그대로입니다. 이 후, 당신은 여전히 ​​16 진수 값을 얻고 싶은 경우에

, 당신과 같이 문자열의 시작 부분에 r을 추가 할 수 있습니다

line=r'1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000' 

가 문자열 리터럴 확인합니다. 정규 표현식은 다른 문자열과 마찬가지로 리터럴을 처리해야합니다.