4

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

输入字符串:

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:

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

4

1 回答 1

3

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

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

否则,由于您使用惰性量词 ( *?),您将获得可能的最短匹配,即之后什么都没有start_of_line:

另一种方式:

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

在这里,我使用了一个字符类,其中除了换行符 ( \n) 之外的所有字符都重复了一次或多次。当正则表达式引擎找到换行符时,它会测试是否start_of_line:不遵循。我重复该组零次或多次。

这种模式比第一种模式更有效,因为只有在遇到换行符时才执行前瞻(而不是在每个字符上)

于 2013-06-26T21:10:37.157 回答