Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据子字符串索引查找内容_Python_Regex - Fatal编程技术网

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

Python 根据子字符串索引查找内容,python,regex,Python,Regex,以下代码根据文件的子字符串出现情况(我在这里说关键字)以及与之相关的文本从文件中提取行: 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

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

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)))
报告的产出:

图案说明

  • (?m)
    -
    re.多行
    修改器制作
    ^
    匹配行的起始
  • ^
    -行的开头
  • (?:{0})
    -a将包含列出的备选方案(例如,
    项目总价值|总重量|总体积
  • *
    -除LF以外的任何0+字符(行的其余部分)
  • (?:[\r\n]+(?!(?:{0})).*)
    -0或更多次重复:
    • [\r\n]+(?!(?:{0}))
      -1个或多个LF或/和CR符号(
      [\r\n]+
      )后面没有任何
      关键字
    • *
      -行的其余部分

下一个关键词前总是有换行符吗?@Sven Krüger-YesDo有什么帮助的答案吗?@MikeRobins-谢谢,让我看看。我不知道你的正则表达式知识水平:),所以我只能建议你在上完成所有课程,通读,(通过许多其他链接到伟大的在线资源),以及所谓的社区。还有,值得一看。
['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.']