gpt4 book ai didi

python - 根据子串索引查找内容

转载 作者:行者123 更新时间:2023-12-01 09:24:19 25 4
gpt4 key购买 nike

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

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 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}) - a non-capturing group它将包含 | alternation operator 列出的替代品(例如商品总值(value)|总重量|总体积)
  • .* - 除 LF(该行的其余部分)之外的任何 0+ 个字符
  • (?:[\r\n]+(?!(?:{0})).*)* - 0 次或多次重复:
    • [\r\n]+(?!(?:{0})) - 1 个或多个 LF 或/和 CR 符号 ([\r\n]+) 后面没有任何关键字
    • .* - 该行的其余部分

关于python - 根据子串索引查找内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com