首页 > 解决方案 > 如何在大文件中的字符串中grep相同的子字符串模式?

问题描述

在包含以下水果名称的文件中:

file name : fruits.txt

-fruit apple -fruit- \
    -fruit orange -fruit- \
-fruit pear -fruit- \
    -fruit pear -fruit- -fruit pineapple -fruit- \
-fruit abcd apple efgh -fruit- -fruit jkl pear lkj -fruit- \

备注:使用 grepfunc.grep_iter 的原因是因为我需要扫描非常大的文件,然后 grep 出名称

问题:如何使用 grep 功能模块提取文件中的所有水果名称?

与第 4 行的情况一样,我只将“菠萝”的结果作为一个子字符串,但没有第一个水果名称“梨”。

另一个例子,第5行我得到了'jkl pear lkj'的结果,但不是'apple'作为一个子字符串,'pear'作为另一个子字符串。

因此,我现在面临的主要问题是文件中的同一行(带有两个水果名称)无法将两个水果名称 grep 出来。

这是我尝试过的编码,

import grepfunc

fruit_array = []
file1 = open('fruits.txt', 'r')
for fruit_name in grepfunc.grep_iter(file1, ".*-fruit"):
    fruit_name = re.sub(r'^.*-fruit ', '', fruit_name)
    fruit_name = re.sub(r' -fruit-.*$', '', fruit_name)
    fruit_array.append(fruit_name)
    print(fruit_name)

预期结果:fruit_array = ['apple', 'orange', 'pear', 'pear', 'pineapple', 'apple', 'pear']

真实结果:fruit_array = ['apple', 'orange', 'pear', 'pineapple', 'jkl pear lkj']

标签: python-3.x

解决方案


假设您可以容忍将整个fruit.txt文件读入内存,在 Python 中,您可以使用re.findall以下模式-fruit (\S+)

inp = """-fruit apple -fruit- \
-fruit orange -fruit- \
    -fruit pear -fruit- \
    -fruit pear -fruit- -fruit pineapple -fruit- \ """
fruits = re.findall(r'-fruit (\S+)', inp)
print(fruits)

这打印:

['apple', 'orange', 'pear', 'pear', 'pineapple']

推荐阅读