根据子字符串索引查找内容

Posted

技术标签:

【中文标题】根据子字符串索引查找内容【英文标题】:Find the content based on substring indexes 【发布时间】:2018-11-06 15:50:44 【问题描述】:

以下代码根据子字符串的出现(我在这里说关键字)以及与之关联的文本从文件中提取行:

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 方法来实现吗?

由于我的文件中的内容不是固定的,所以无法使用某些正则表达式来提取它。逻辑是,找到关键字并获取它前面的所有内容,除非出现下一个关键字。

【问题讨论】:

下一个关键字之前总是有换行符吗? @Sven Krüger- 是的 对How to parse complex text files using Python?的任何答案有帮助吗? @MikeRobins - 谢谢,让我看看。 我不知道你的正则表达式知识水平 :) 所以我只能建议在regexone.com 完成所有课程,阅读regular-expressions.info,regex SO tag description(还有许多其他链接到很棒的在线资源),以及名为 What does the regex mean 的社区 SO 帖子。另外,rexegg.com 值得一看。 【参考方案1】:

这是我建议的修复方法:

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 demo 的输出:

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

模式说明

(?m) - re.MULTILINE 修饰符使 ^ 匹配行首 ^ - 行首 (?:0) - 一个non-capturing group,将包含| alternation operator 列出的备选方案(例如Total item value|Total weight|Total volume.* - 除 LF 以外的任何 0+ 个字符(该行的其余部分) (?:[\r\n]+(?!(?:0)).*)* - 0 次或多次重复: [\r\n]+(?!(?:0)) - 1 个或多个 LF 或/和 CR 符号 ([\r\n]+) 后不跟任何 keywords 项目 .* - 该行的其余部分

【讨论】:

以上是关于根据子字符串索引查找内容的主要内容,如果未能解决你的问题,请参考以下文章

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类slice函数根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类使用方括号索引根据起始索引抽取字符串内容的子字符串(如果只有一个数字默认索引到字符串结束)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类使用方括号索引根据起始索引抽取字符串内容的子字符串(如果只有一个数字默认索引到字符串结束)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类使用方括号索引根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间-1代表最后一个索引位置)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类slice函数根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间-1代表最后一个索引位置)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类slice函数根据起始索引抽取字符串内容的子字符串(如果只有一个数字默认索引到字符串结束)