我有一个文本文件,我希望使用正则表达式匹配单词PATTERN
,并在START
和END
之间提取文本(下面显示的文本文件)。我不想直接匹配START
和END
字段,因为我在该部分中有随机数据,但PATTERN
保持不变,因此我可以轻松匹配。我有一个快速而肮脏的Python脚本,可以匹配模式,但我已经陷入了下一步。
HERE IS MY PATTERN:
IGNORE SECTION
**************************************************
START 1 2 3 4 5
. . . . . .
. . . . . .
. . . . . .
END . . . . .
TEXT FILE CONTINUES...........
.
.
.
.
**************************************************
如何告诉Python 读取模式下方5行的行,并在读取第一个空行时停止?
这是我的剧本:
#!usr/bin/env python
import re
pattern = r'PATTERN:'+'$'
count = 0
fp = open('fileinput.txt')
for line in fp:
count += 1
match = re.search(pattern,line)
if match:
print 'Matched text:', line, 'Line', count
line_match = count
new_line = line_match+4
我已经标记了我想要的行,但是不能告诉Python从此时开始读取文件,并在它到达空行时退出。有什么提示吗?
答案 0 :(得分:2)
我认为你根本不需要正则表达式,你可以使用endswith
。这是我将如何实现它。它不可扩展,但它可以做你想要的:
matching = False
found = []
with open('fileinput.txt', 'r') as file
it = iter(file)
for line in it:
if matching:
if line.strip() == '':
break
else:
found.append(line)
elif line.endswith('PATTERN:'):
for _ in range(6):
next(it)
matching = True
由于您知道START
在PATTERN
之后发生了5行,因此无需搜索它,因此我使用assert
来确保它在预期的位置。匹配的行存储到found
,您可以使用
for line in found:
print line
答案 1 :(得分:0)
我没有很好地解释你的解释;从我能够理解的,你需要:
1)从特定模式读取文件直到空行;
2)将读取的部分与多线模式匹配。
实现这一目标:
1)使用readline()
,readlines()
,xreadlines()
或for line in file
将所有感兴趣的文本读入一个变量中 - 最方便的是什么。
请注意,for line if file
循环可以随时break
停止xreadlines()
- 只是停止读取。下次调用它们时,它们将从文件中的当前位置开始
2)如果您需要\n
来匹配换行符,请将其与包含re.M
的模式匹配或使用.
标记。
for l in f:
if re.match("PATTERN:\n",l): break
s=""
for l in f:
if l=='\n': break
s+=l
m=re.match("<whatever-pattern-matches-your-chunk-of-text>",s)