2016-09-20 21 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 

[( 'VEGETABLE 1'、 '\ nはCARROT_PRODUCE 1.3 A_BRAZIL/AFRICA')]

しかしなどのコンテンツ間には欠けている。

+0

コードのインデントを読みやすくすることができますか? – MooingRawr

+0

*検索* 're.search( '(\ d \ s +)(\ w + \ s)+'、str2)'はなぜですか? –

+0

'(\ d \ s +)(\ w + \ s)'は1つのマッチであり、次のマッチでは '(\ d \ s +)'の部分が欠落しているためです。 – nauer

答えて

0

この回答の最後のスニペットの解決策。

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

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

出力は、指定されたパターンが1回だけ出現するリストです。リスト内のタプルは、最初の一致の代わりに貪欲最後一致

を選択するためのパターンを作った「+」最後に削除パターン

実験1

に(内所定の2グループに対応する一致二つの文字列)が含まれ

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

実験2

は、第三の単語が1つ以上のスペースが続く見つけるために、1つの以上のグループを追加しました。しかし、刺しゅうに3単語以上のスペースが続く場合は、3単語しか見つからない。

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

実験3

使用 '|'パターンmultipel時間に一致させる。タプルが消えたことに注意してください。また、最初の試合には数字だけが含まれていないことに注意してください。 \ wは\ 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

関連する問題