如果我的字符串看起来像:
s = """
...
Random Stuff
...
HEADER
a 1
a 3
# random amount of rows
a 17
RANDOM_NEW_HEADER
a 200
a 300
...
More random stuff
...
"""
是否有一种干净的方法可以使用正则表达式(在Python中)在HEADER之后找到a \d*
的所有实例,但是在SOMETHING_TOTALLY_DIFFERENT打破模式之前?我想到了类似的东西:
import re
pattern = r'HEADER(?:\na \d*)*\na (\d*)'
print re.findall(pattern, s)
不幸的是,正则表达式并没有找到重叠的匹配。如果使用正则表达式没有合理的方法,我可以比编写自己的for循环更快地提取这些数据。
(TL; DR - 那里有一个独特的标题,后面跟着一个重复的模式。我想抓住那个模式的每个实例,只要重复没有中断。)< / p>
编辑:
为了澄清,我不一定知道SOMETHING_TOTALLY_DIFFERENT会是什么,只是它不会匹配a \d+
。我想收集\na \d+
后跟HEADER\n
的所有连续实例。
答案 0 :(得分:2)
一个简单的循环怎么样?
import re
e = re.compile(r'(a\s+\d+)')
header = 'whatever your header field is'
breaker = 'something_different'
breaker_reached = False
header_reached = False
results = []
with open('yourfile.txt') as f:
for line in f:
if line == header:
# skip processing lines unless we reach the header
header_reached = True
continue
if header_reached:
i = e.match(line)
if i and not breaker_reached:
results.append(i.groups()[0])
else:
# There was no match, check if we reached the breaker
if line == breaker:
breaker_reached = True
答案 1 :(得分:0)
不完全确定你想要正则表达式停止的地方请澄清
'((a \ d *)\ s){1,}'
答案 2 :(得分:0)
TWO