附件是我要解析的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。
答案 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)
试试这个。添加一个预测。