python RE:非贪婪的匹配,重复和分组

时间:2013-06-26 21:08:31

标签: python regex

我正在尝试使用python RE匹配重复的线条模式

input_string:

start_of_line:x
第1行 第2行 start_of_line:y
第1行 第2行 第3行 start_of_line:z
第1行

基本上我想在循环中提取字符串(每个字符串从start_of_line开始,直到下一个start_of_line之前的所有字符)

我可以使用for循环轻松解决这个问题,但是想知道是否有一个python RE可以做到这一点,尝试了我的最好但是却陷入了分组部分。

最接近我的解决方案是

pattern= re.compile(r"start_of_line:.*?", re.DOTALL)
for match in re.findall(pattern, input_string):
    print "Match =", match

但它打印

Match = start_of_line:
Match = start_of_line:
Match = start_of_line:

如果我做任何其他事情要分组,我会输掉比赛。

1 个答案:

答案 0 :(得分:3)

要使用正则表达式执行此操作,必须使用先行测试:

r"start_of_line:.*?(?=start_of_line|$)"

另外,因为你使用了一个惰性量词(*?),你将获得尽可能短的匹配,即在start_of_line:之后没有任何内容

另一种方式:

r"start_of_line:(?:[^\n]+|\n(?!start_of_line:))*"

这里我使用一个包含除换行符(\n)以外的所有字符的字符类,重复一次或多次。当正则表达式引擎找到换行符时,它会测试start_of_line:是否跟随。我重复这个组零次或多次。

此模式比第一种模式更有效,因为前瞻仅在遇到换行时执行(vs每个字符)