2016-09-20 4 views
1

이전에 정확한 질문을 넣을 수 없었습니다. 사과드립니다. 나는 아래 파일에서 문자열을 읽고있다python에서 findall을 사용하여 필수 출력을 얻지 못함

및 파일의 문자열의 여러 같은 종류가있을 수있다 : 아래

내가 무엇을 찾고있다.

" VEGETABLE 1 
    POTATOE_PRODUCE 1.1 1SIMLA(INDIA) 
    BANANA 1.2 A_BRAZIL(OR INDIA) 
    CARROT_PRODUCE 1.3 A_BRAZIL/AFRICA" 

findall 만 사용하여 전체 문자열을 출력으로 캡처하려고합니다.

내 스크립트를

위 스크립트가 출력을주고있다

import re 
import string 

f=open('log.txt') 
contents = f.read() 
output=re.findall('(VEGETABLE.*)(\s+\w+\s+.*)+',contents) 
print output 

[('야채 1', '\ n CARROT_PRODUCE 1.3 A_BRAZIL/아프리카')]

그러나 같은 내용 중간에

+0

우리가 쉽게 읽을 수 있도록 코드 들여 쓰기를 사용할 수 있습니까? – MooingRawr

+0

* 검색 *'re.search ('(\ d \ s +) (\ w + \ s) +', str2)'? –

+0

'(\ d \ s +) (\ w + \ s)'가 하나의 일치이므로 다음 부분에서는'(\ d \ s +)'부분이 빠져 있기 때문입니다. – nauer

답변

0

이 답변의 마지막 스 니펫에 해결 방법이 있습니다.

>>> import re 
>>> str2='d1 talk walk joke' 

>>> re.findall('(\d\s+)(\w+\s)+',str2) 
[('1 ', 'walk ')] 

출력은 주어진 패턴이 한 번만 나오는 목록입니다. 목록의 튜플 제거 패턴

실험 1

에() 내에 주어진 두 개의 그룹에 대응하는 정합 두 문자열을 포함하는 마지막 '+'대신 탐욕 마지막 매치

최초로 일치를 선택하는 패턴을 제조하는
>>> re.findall('(\d\s+)(\w+\s)',str2) 
[('1 ', 'talk ')] 

실험 2

라이트 하나 개 이상의 그룹을 찾기 위해 세 번째 단어는 하나 이상의 공백 하였다. 그러나 찌르다가 3 단어 이상에 공백이 오면 3 단어 만 찾습니다.

>>> re.findall('(\d\s+)(\w+\s)(\w+\s)',str2) 
[('1 ', 'talk ', 'walk ')] # 

실험 3

사용 '|' 패턴 multipel 시간을 일치시킵니다. 튜플이 사라 졌다는 것에 유의하십시오. 또한 첫 번째 경기에는 숫자 만 포함되지 않습니다. 이 될 수있다 \ \ d를

>>> re.findall('\d\s+|\w+\s+',str2) 
['d1 ', 'talk ', 'walk '] 

최종 실험이 도움이

>>> re.findall('\d\s+|[a-z]+\s+',str2) 
['1 ', 'talk ', 'walk '] 

희망의 상위 집합입니다 승 때문이다.

+0

실험 3에서 'd1'을 피하려면 re.findall ('\ d \ s + | [a-zA-Z] + \ s +')와 같이 \ w를 [a-zA- , str2)' – nauer

+0

. 안녕하세요. 제 질문을 업데이트했습니다. 도와 주시면 감사하겠습니다. 고맙습니다. – sentu