2013-07-23 3 views
0

JSON 문자열 묶음을 통해 데이터를 수신하고 있습니다. 그러나, 나는 바이트의 세트 금액을받습니다, 그래서 때로는 마지막 JSON 문자열이 잘립니다. 파이썬으로Python Regex : '{'로 시작하고 '}'로 끝나는 모든 행 찾기

{"pitch":-30.778193,"yaw":-124.63285,"roll":-8.977466} 
{"pitch":-30.856342,"yaw":-124.57556,"roll":-7.7220345} 
{"pitch":-31.574106,"yaw":-124.65623,"roll":-7.911794} 
{"pitch":-30.479567,"yaw":-124.24301,"roll":-8.730827} 
{"pitch":-29.30239,"yaw":-123.97949,"roll":-8.134723} 
{"pitch":-29.84712,"yaw":-124.584465,"roll":-8.588374} 
{"pitch":-31.072054,"yaw":-124.707466,"roll":-8.877062} 
{"pitch":-31.493435,"yaw":-124.75457,"roll":-9.019922} 
{"pitch":-29.591925,"yaw":-124.960815,"roll":-9.379437} 
{"pitch":-29.37105,"yaw":-125.14427,"roll":-9.642341} 
{"pitch":-29.483717,"yaw":-125.16528,"roll":-9.687177} 
{"pitch":-30.903332,"yaw":-124.603935,"roll":-9.423098} 
{"pitch":-30.211857,"yaw":-124.471664,"roll":-9.116135} 
{"pitch":-30.837414,"yaw":-125.18984,"roll":-9.824204} 
{"pitch":-30.526165,"yaw":-124.85788,"roll":-9.158611} 
{"pitch":-30.333513,"yaw":-123.68705,"roll":-7.9481263} 
{"pitch":-30.903502,"yaw":-123.78847,"roll":-8.209373} 
{"pitch":-31.194769,"yaw":-124.79708,"roll":-8.709783} 
{"pitch":-30.816765,"yaw":-125 

이, 내가 처음 18 완전한 { data... } 문자열의 문자열 배열을 만들 싶습니다 : 나는 일반적으로 다음을 얻을 것이다.

여기 제가 시도한 바가 있습니다 : cleanData = re.search('{.*}', data)하지만 이것은 매우 처음 인 것 같습니다. { data... } 항목. 완전한 {} 세트의 문자열 배열을 어떻게 얻을 수 있습니까?

답변

2

당신은 당신이 re.finditer 또는 re.findall 사용할 수있는, 모두를 얻으려면 re.findall() (또는 re.finditer)

>>> import re 
>>> for r in re.findall(r'{.*}', data)[:18]: 
    print r 


{"pitch":-30.778193,"yaw":-124.63285,"roll":-8.977466} 
{"pitch":-30.856342,"yaw":-124.57556,"roll":-7.7220345} 
{"pitch":-31.574106,"yaw":-124.65623,"roll":-7.911794} 
{"pitch":-30.479567,"yaw":-124.24301,"roll":-8.730827} 
{"pitch":-29.30239,"yaw":-123.97949,"roll":-8.134723} 
{"pitch":-29.84712,"yaw":-124.584465,"roll":-8.588374} 
{"pitch":-31.072054,"yaw":-124.707466,"roll":-8.877062} 
{"pitch":-31.493435,"yaw":-124.75457,"roll":-9.019922} 
{"pitch":-29.591925,"yaw":-124.960815,"roll":-9.379437} 
{"pitch":-29.37105,"yaw":-125.14427,"roll":-9.642341} 
{"pitch":-29.483717,"yaw":-125.16528,"roll":-9.687177} 
{"pitch":-30.903332,"yaw":-124.603935,"roll":-9.423098} 
{"pitch":-30.211857,"yaw":-124.471664,"roll":-9.116135} 
{"pitch":-30.837414,"yaw":-125.18984,"roll":-9.824204} 
{"pitch":-30.526165,"yaw":-124.85788,"roll":-9.158611} 
{"pitch":-30.333513,"yaw":-123.68705,"roll":-7.9481263} 
{"pitch":-30.903502,"yaw":-123.78847,"roll":-8.209373} 
{"pitch":-31.194769,"yaw":-124.79708,"roll":-8.709783} 
4

이 필요합니다.

>>> re.findall(r'{.*}', s) 
['{"pitch":-30.778193,"yaw":-124.63285,"roll":-8.977466}', '{"pitch":-30.856342,"yaw":-124.57556,"roll":-7.7220345}', '{"pitch":-31.574106,"yaw":-124.65623,"roll":-7.911794}', '{"pitch":-30.479567,"yaw":-124.24301,"roll":-8.730827}', '{"pitch":-29.30239,"yaw":-123.97949,"roll":-8.134723}', '{"pitch":-29.84712,"yaw":-124.584465,"roll":-8.588374}', '{"pitch":-31.072054,"yaw":-124.707466,"roll":-8.877062}', '{"pitch":-31.493435,"yaw":-124.75457,"roll":-9.019922}', '{"pitch":-29.591925,"yaw":-124.960815,"roll":-9.379437}', '{"pitch":-29.37105,"yaw":-125.14427,"roll":-9.642341}', '{"pitch":-29.483717,"yaw":-125.16528,"roll":-9.687177}', '{"pitch":-30.903332,"yaw":-124.603935,"roll":-9.423098}', '{"pitch":-30.211857,"yaw":-124.471664,"roll":-9.116135}', '{"pitch":-30.837414,"yaw":-125.18984,"roll":-9.824204}', '{"pitch":-30.526165,"yaw":-124.85788,"roll":-9.158611}', '{"pitch":-30.333513,"yaw":-123.68705,"roll":-7.9481263}', '{"pitch":-30.903502,"yaw":-123.78847,"roll":-8.209373}', '{"pitch":-31.194769,"yaw":-124.79708,"roll":-8.709783}'] 
>>> 

또는

>>> [x.group() for x in re.finditer(r'{.*}', s)] 
['{"pitch":-30.778193,"yaw":-124.63285,"roll":-8.977466}', '{"pitch":-30.856342,"yaw":-124.57556,"roll":-7.7220345}', '{"pitch":-31.574106,"yaw":-124.65623,"roll":-7.911794}', '{"pitch":-30.479567,"yaw":-124.24301,"roll":-8.730827}', '{"pitch":-29.30239,"yaw":-123.97949,"roll":-8.134723}', '{"pitch":-29.84712,"yaw":-124.584465,"roll":-8.588374}', '{"pitch":-31.072054,"yaw":-124.707466,"roll":-8.877062}', '{"pitch":-31.493435,"yaw":-124.75457,"roll":-9.019922}', '{"pitch":-29.591925,"yaw":-124.960815,"roll":-9.379437}', '{"pitch":-29.37105,"yaw":-125.14427,"roll":-9.642341}', '{"pitch":-29.483717,"yaw":-125.16528,"roll":-9.687177}', '{"pitch":-30.903332,"yaw":-124.603935,"roll":-9.423098}', '{"pitch":-30.211857,"yaw":-124.471664,"roll":-9.116135}', '{"pitch":-30.837414,"yaw":-125.18984,"roll":-9.824204}', '{"pitch":-30.526165,"yaw":-124.85788,"roll":-9.158611}', '{"pitch":-30.333513,"yaw":-123.68705,"roll":-7.9481263}', '{"pitch":-30.903502,"yaw":-123.78847,"roll":-8.209373}', '{"pitch":-31.194769,"yaw":-124.79708,"roll":-8.709783}'] 
>>> 
+0

나는 이것이 OP가 원하는 실제로 무엇을 생각하지 않는다, 그러나 당신이 실제로 단지 첫 18 경기를 원하는 경우 사용할 수 있다는 것을 주목할 필요가 ['itertools.islice'] (http://docs.python.org/2/library/itertools.html#itertools.islice)'(re.finditer(r'{.*} ', s), 18)'. 또한'{'/'}'이 라인을 시작/끝내기 위해서는're.finditer (r '^ {. *} $', s, re.MULTILINE)'을 사용할 수 있습니다. – Dougal

+0

나는 그것이 확실하지 않지만 이것이 OP가 원하는 것이라고 생각한다. 그러나 itertools.islice가 필요하다고 생각하지 않습니다. 'finditer'는 모든 일치를 얻고 슬라이스 할 필요가 없습니다. 게다가 생성기 만 반환하므로 결과를 얻기 위해 루프를 반복해야합니다. – zhangyangyu

+0

나는 이것이 OP가 원한 것이라고 생각하지 않는다는 것에 동의하지만, 가능하다면 충분히 유사하다. 그리고 반복자 대신 목록을 원한다면'list()'를 호출하면됩니다. – Dougal

관련 문제