2012-11-08 3 views
2

아래 입력을 기반으로 목록을 만들려고하는데 예상 한 결과가 표시되지 않습니다. 누구든지 내가 잘못 가고 있다고 제안 할 수 있습니까?목록이 잘못 생성되었습니다.

INPUT :

CR FA CL Title 
409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 
415560 WLAN 656886 To Record SMD Event Logging 

내가

[['CR', 'FA', 'CL', 'TITLE'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886','To Record SMD Event Logging']] 

같은 출력이 원하는하지만 그것

[['CR', 'FA', 'CL', 'TITLE'], ['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario'], ['', '415560', 'WLAN', '656886\tTo Record SMD Event Logging']] 

파이썬 코드처럼 만들어지고 참조

,536,913,632 10
for i in info.splitlines(): 
    index = re.split(r'\W+',i,3) 
    CRlist.append(index) 
+0

당신은'(예를 들어, 몇 가지 여분의 각 라인의 시작에 여분의 공백이 없다 확실 \ r's는 universal-newlines 모드없이 다른 플랫폼의 텍스트 파일을 파싱했기 때문에 주위에 누워 있습니까?) 그게 정확히 당신이 그런 경우에 보게 될 것이기 때문입니다. – abarnert

+0

여분의 whilespaces가있을 수 있습니다. \ r, \ n, 그 모두를 제거하고 싶습니다. – user1795998

+0

파일에 입력 내용을 복사하고 code.it을 테스트 한 결과, 플랫폼 차이점이 있습니다. – oyss

답변

2

출력은 처음부터 각 줄의 시작 부분에 여분의 공백이 있으면 기대했던 것입니다.

일반적인 이유 중 하나는 보편적 인 줄 바꿈 모드를 사용하지 않고 잘못된 줄 끝을 사용하여 파일을 구문 분석하려고 시도 했으므로 아무리 혼란스러워 보였습니다.

예를 들어, 다음 두 줄은 텍스트 편집기에서 동일하게 보일 수 있습니다 :

409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 
\r409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 

하지만 당신의 re.split 그들과 매우 다른 일을 할 것입니다 :

['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'] 
['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario'] 

솔루션은 벗겨하는 것입니다 초과 공백. 좀 더 복잡한 정규 표현식을 쓰거나 단지 re.split(r'\W+', s.lstrip(), 3)을 쓰려고 할 수 있습니다.

후행 공백을 제거하려는 경우 lstrip : re.split(r'\W+', s.strip(), 3) 대신 strip을 사용하십시오.

하지만 어째서 s.strip().split(None, 3)을 할 수 있는지 처음부터 regexp를 사용하고 있는지 확실하지 않습니다.

1

난 당신이 오히려 csv 모듈을 사용해야 느낌이 있지만, 여기가 아닌 정규식 솔루션입니다 :

>>> s = '''CR FA CL Title 
... 409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 
... 415560 WLAN 656886 To Record SMD Event Logging''' 
>>> [x.strip().split(None, 3) for x in s.splitlines()] 
[['CR', 'FA', 'CL', 'Title'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886', 'To Record SMD Event Logging']] 
+0

이것은 그의 문제를 해결하지 못할 것입니다. 그것은 원래 코드와 똑같은 경우에 작동합니다. 그리고 컬럼 4의 모든 공백을 단일 공백으로 변환하는 부작용이 있습니다. – abarnert

+0

4 열의 공백을 공백으로 어떻게 변환합니까? – wim

+0

현재 버전은 아니지만 이전 버전이 사용했습니다. (또는 아마도 같은 위치에있는 다른 답변이 당신의 것으로 대체 되었습니까? 확실하지 않습니다 ...)'split()'을 수행 한 다음 마지막 열을'' '.join (x [3])'으로 재결합했습니다. – abarnert

0

당신이있는 경우 \ t 당신이 사용할 수 있습니다이 (사용할 수있는 것보다 구분자로 스트립 item.strip()가 확인 여부를 빈 항목인지 만약 그렇다면 그것을 건너 뛰고 있는지 확인은) :

012 : 당신이 열 beetween 여러 공간이있는 경우

info = """ 
      CR FA CL Title 
      409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 
      415560 WLAN 656886 To Record SMD Event Logging 
     """ 
[[x.strip() for x in row.split('\t') if x.strip()] for row in info.split('\n')] 

당신은 TI는이를 사용하여 시도 할 수 있습니다

또는 결합 : 마지막으로

[[x.strip() for x in row.replace('\t', ' ').split(' ') if x.strip()] for row in info.split('\n')] 

및 분할 사용하지 않는 (없음, 3) :

[row.split(None, 3) for row in info.split('\n')] 
+0

왜'split (None)'이 어떤 공백으로 나뉘어서 왜 분명히 원하는 것인가? ('r '\ W''를 사용할 때)? 한편, 이미 작동중인 코드 부분을 다시 작성하고 있습니다. 당신은 거기에 아마도 고침 ('strip()')을 가지고 있지만 코멘트가 없으므로 그 사실을 알 수 없을 것입니다. – abarnert

+0

내가 동의하지 못하게하자. 나는 그가 각 공간에서 나뉘고 싶어한다는 것을 알 수 없었다. 마지막 열에는 공백이있는 문장이 들어 있었고 그는 그것을 전체로 갖고 싶어했다. 그렇지 않은가? 스트립뿐만 아니라 표 형식의 문제를 제거하지 않습니다. –

+0

그는 각 공백을 나누고 싶지만 처음 세 개는 공백으로 나눕니다. 당신이 그의 정규 표현식과 그의 예상 결과를 읽는다면, 그것이 의미할만한 것은 아무것도 없다. 그리고 나는 당신이 말하는 "표의 문제"가 무엇인지 잘 모릅니다. 'strip'은 코드가 실제로 가지고있는 유일한 문제를 해결할 것입니다. – abarnert

관련 문제