组与正则表达式匹配

时间:2021-07-26 16:42:57

标签: python regex

我有这样的东西:

Some info_a
Useless info
sub_info_a
Useless info

Some info_b
Useless info
sub_info_b_1
sub_info_b_2
Useless info

Some info_c
Useless info
sub_info_c
Useless info

我想创建组,这样我就可以拥有这样的东西:

(info_a, sub_info_a), (info_b, sub_info_b_1, sub_info_b_2), (info_c, sub_info_c)

我试过了:

^Some (info_\w+) .*$\n.*$\n(?:^(sub_info_\w+) .*$\n)+

但它只匹配最后一个 sub_info_b

(info_a, sub_info_a), (info_b, sub_info_b_2), (info_c, sub_info_c)

我也试过:

^Some (info_\w+) .*$\n.*$\n|^(sub_info_\w+) .*$\n

这个给了我:

('info_a', ''), ('', 'sub_info_a'), ('info_b', ''), ('', 'sub_info_b_1'), ('', 'sub_info_b_2'), ('info_c', ''), ('', 'sub_info_c')

这不是我真正想要的。 请注意,sub_info 可以出现不止一次或两次。

1 个答案:

答案 0 :(得分:1)

^Some (info_\w+).*\n.*\n((?:^sub_info_\w+.*\n)+)

捕获组应该围绕量化的非捕获组。当您量化捕获组时,它只捕获最后一次出现的情况。所以你需要围绕它组织一个小组来捕捉所有的重复。

请注意,这不会将结果中的每个重复放入单独的组中 - 结果中的捕获组和 .group(n) 项之间始终存在一对一的对应关系。处理正则表达式的结果时需要拆分第二个捕获组。

我也删除了 .* 之前的空格,\n$ 都不需要了。

DEMO