我正在尝试使用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:
如果我做任何其他事情要分组,我会输掉比赛。
答案 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每个字符)