使用python正则表达式在标题后找到重复的值

时间:2016-08-10 01:07:39

标签: regex python-2.7

如果我的字符串看起来像:

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的所有连续实例。

3 个答案:

答案 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