python-3.x - 如何在大文件中的字符串中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']
解决方案
假设您可以容忍将整个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']
推荐阅读
- node.js - 在 node.js 中将字符串转换为 64 位浮点数
- ios - 将 JSON 请求循环到后端(REST API)
- minizinc - 基于约束最大化
- google-cloud-platform - 在 GCP 中创建没有公共 IP 的虚拟机
- node.js - 我存储在 s3 中的对象在访问 url 时会自动下载
- tomcat - URL 中的两个连续点将 URL 导航向后移动一步
- javascript - 为什么 jQuery 验证显示单词“false”而不是我的自定义消息?
- python - 实现一个简单的插件管理器类,它能够注册需要不同参数的检查函数
- ios - 启用 https 时,iOS 应用程序无法 ATS 系统信任
- wordpress - WPBakery Page Builder 后端编辑器不工作