python - 根据子字符串索引查找内容
问题描述
以下代码根据其子字符串的出现(我将在这里说关键字)以及与之关联的文本从文件中提取行:
from itertools import count
def find_content_blocks_by_keywords(lines, keywords):
keyword_indexes = sorted([i for i, line in zip(count(), lines) for
keyword in keywords if re.search(keyword, line)])
return [lines[i:j] for i, j in zip([0]+keyword_indexes, keyword_indexes+[None])]
这是我的示例文本文件
keywords = ['Total item value', 'Total weight', 'Total volume']
lines = ['Total item value RSX 05,018.88\n',
'Total weight 90,969 EUR\n',
'Total volume -97.93 X3 Sca.\n',
'197.939 X3 Sca.']
要提取的子字符串及其值
result = find_content_blocks_by_keywords(lines, keywords):
样本结果:
[[],
['Total item value RSX 05,018.88\n'],
['Total weight 90,969 EUR\n'],
['Total volume -97.93 X3 Sca.\n', '197.939 X3 Sca.']]
我们可以直接使用re.findall
或任何其他re
方法来实现这一点吗?
由于内容在我的文件中不固定,因此无法使用某些正则表达式来提取它。逻辑是,找到关键字并获取它前面的所有内容,除非出现下一个关键字。
解决方案
这是我建议的修复方法:
from itertools import count
import re
keywords = ['Total item value', 'Total weight', 'Total volume']
lines = ['Total item value RSX 05,018.88\n',
'Total weight 90,969 EUR\n',
'Total volume -97.93 X3 Sca.\n',
'197.939 X3 Sca.']
pat = r'(?m)^(?:{0}).*(?:[\r\n]+(?!(?:{0})).*)*'.format("|".join([re.escape(x) for x in keywords]))
print(re.findall(pat, "\n".join(lines)))
Python 演示的输出:
['Total item value RSX 05,018.88\n', 'Total weight 90,969 EUR\n', 'Total volume -97.93 X3 Sca.\n\n197.939 X3 Sca.']
图案说明
推荐阅读
- numpy - 如何使用 NumPy 将数组中的每个元素更改为数组的平均值?
- r - 用R中两个较大的data.frames中的任何两个同名变量制作一个`data.frame`
- laravel - VS Code / 你如何定义自定义“去定义”?
- azure - 使用 K3s 时如何从 Azure Container Registry 拉取镜像?
- javascript - 如何在Javascript中为数组中的随机元素添加不同的数据属性?
- java - C客户端套接字数据无法在Java服务器中读取
- javascript - 类型错误:评论未定义
- python - Python中多个重复的lambda函数的内存成本是多少?
- c++ - 如何按降序对标准数组进行排序 - C++ 11
- zoho - 使用 Deluge 功能重定向到 Zoho 匹配的客户记录