Python:使用正则表达式查找最后一对事件

时间:2014-11-21 00:45:46

标签: python regex

附件是我要解析的text file。我想选择单词'occurrence:

的最后一个组合中的文本
  • (1)第7项管理层讨论分析

  • (2)第8项财务报表

我通常会使用regex,如下所示:

re.findall(r"Item(?:(?!Item).)*7(?:(?!Item|7).)*Management(?:(?!Item|7|Management).)*Analysis[\s\S]*Item(?:(?!Item).)*8(?:(?!Item|8).)*Financial(?:(?!Item|8|Financial).)*Statements",text, re.DOTALL)

你可以在文本文件中看到,第7项和第8项的组合经常发生但是如果我找到最后一个匹配(1)和最后一个匹配(2),我会大量增加获取所需文本的概率

我的文本文件中的所需文本以:

开头
  

“'这个项目7,管理层的讨论和   财务状况和经营业绩分析等   本表格10-K的部分内容包含前瞻性陈述   1995年“私人证券诉讼改革法案”的含义   涉及风险和......“

并以:

结束
  

“第8项。   财务报表和补充数据“

如何调整我的正则表达式代码以获取第7项和第8项之间的最后一对?

更新:

我也尝试使用相同的项解析此file

3 个答案:

答案 0 :(得分:2)

此代码已被重写。它现在适用于原始数据文件(Output2.txt)和新添加的数据文件(Output2012.txt)。

import re

discussions = []
for input_file_name in ['Output2.txt', 'Output2012.txt']:
    with open(input_file_name) as f:
        doc = f.read()

    item7 = r"Item 7\.*\s*Management.s Discussion and Analysis of Financial Condition and Results of Operations"
    discussion_text = r"[\S\s]*"
    item8 = r"Item 8\.*\s*Financial Statements"

    discussion_pattern = item7 + discussion_text + item8
    results = re.findall(discussion_pattern, doc)

    # Some input files have table of contents and others don't 
    # just keep the last match
    discussion = results[len(results)-1]

    discussions.append((input_file_name, discussion))

discussion变量包含每个数据文件的结果。


这是原始解决方案。它不适用于新文件,但会显示命名组的使用。我不熟悉StackOverflow协议。我应该删除这个旧代码吗?

通过使用较长的匹配字符串,对于第7项,匹配的数量可以减少到2  和第8项 - 目录和实际部分。

因此,搜索第7项的第二次出现,并将所有文本保留到第8项。此代码使用  Python命名组。

import re

with open('Output2.txt') as f:
    doc = f.read()

item7 = r"Item 7\.*\s*Management.s Discussion and Analysis of Financial Condition and Results of Operations"
item8 = r"Item 8\.*\s*Financial Statements"

discussion_pattern = re.compile(
    r"(?P<item7>" + item7 + ")"
    r"([\S\s]*)"
    r"(?P<item7heading>" + item7 +")"
    r"(?P<discussion>[\S\s]*)"
    r"(?P<item8heading>" + item8 + ")"
)       

match = re.search(discussion_pattern, doc)
discussion = match.group('discussion')

答案 1 :(得分:0)

将此模式与s选项

一起使用
.*(Item 7.*?Item 8)  

结果捕获组#1
Demo

.               # Any character except line break
*               # (zero or more)(greedy)
(               # Capturing Group (1)
  Item 7        # "Item 7"
  .             # Any character except line break
  *?            # (zero or more)(lazy)
  Item 8        # "Item 8"
)               # End of Capturing Group (1)
                # "  "

答案 2 :(得分:0)

re.findall(r"Item(?:(?!Item).)*7(?:(?!Item|7).)*Management(?:(?!Item|7|Management).)*Analysis[\s\S]*Item(?:(?!Item).)*8(?:(?!Item|8).)*Financial(?:(?!Item|8|Financial).)*Statements(?!.*?(?:Item(?:(?!Item).)*7)|(?:Item(?:(?!Item).)*8))",text, re.DOTALL)

试试这个。添加一个预测。