在python

时间:2016-09-20 13:45:24

标签: python regex 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 / AFRICA')]

但缺少中间的内容。

1 个答案:

答案 0 :(得分: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个单词后跟空格,那么仍然只能找到三个单词。

>>> 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 ']

希望这有帮助。