Python re.findall不符合我所期望的一切

Python re.findall不符合我所期望的一切,python,regex,python-3.x,Python,Regex,Python 3.x,我必须处理大量包含大量YAML块的文本,如下所示: 键1: -值1 -值2 键1: -值1 -值2 -价值3 每个键的值数可能会有所不同。我想提取不同的键值对,因为我必须检查它们是否以某种方式格式化。我的想法是使用以下正则表达式(我也检查了): 并将其与re.findall()和re.VERBOSE标志一起使用。然而,这导致了 [('key1', '- value3\n'), ('key2', '- value3\n')] 不像我预料的那样 [('key1', '- value1\n', '-

我必须处理大量包含大量YAML块的文本,如下所示:

键1:
-值1
-值2
键1:
-值1
-值2
-价值3

每个键的值数可能会有所不同。我想提取不同的键值对,因为我必须检查它们是否以某种方式格式化。我的想法是使用以下正则表达式(我也检查了):

并将其与
re.findall()
re.VERBOSE
标志一起使用。然而,这导致了

[('key1', '- value3\n'), ('key2', '- value3\n')]
不像我预料的那样

[('key1', '- value1\n', '- value2\n'), ('key', '- value1\n', '- value2\n', '- value3\n']`
更让我困惑的是如果我使用

(.*):\n(-\ .*\n)(-\ .*\n)

所以显式写出值项两三次,效果很好。这当然不是我想要的;我希望捕获每个键的可变数量的值


我在Windows上使用Python 3.8。

您的正则表达式定义了两个捕获组,因此生成的匹配分别包含这两个组的值。如果其中一个组被重复(在您的情况下通过
*
),则它包含最后一个匹配值。如果要重复组中的所有匹配项,可以将其嵌入到另一个组中:

(.*):\n((?:- .*\n)*)
结果将所有
-value*
作为一个字符串包含,因此需要在
'\n'
上手动拆分:

result = {k: v.split('\n') for k, v in re.findall('(.*):\n((?:- .*\n)*)', text)}

你为什么要用regex做这个?使用YAML解析器。您的解决方案如下:,请使用@jonrsharpe提到的解析器,它更简单。@jonrsharpe YAML块只是整个文件的一小部分,并且格式不总是正确的。基本上,我必须检查大量手动创建的文件的结构(例如,正确的MD标题顺序正确)和格式(例如,一些段落应根据周围的元素加粗)。我一直在使用越来越复杂的正则表达式来过滤最基本、最模糊的错误,所以我的第一个方法就是在这里使用正则表达式。不管怎样,谢谢你的回答,我会检查语法分析器。@shanylong谢谢你的链接,我会检查它。虽然对我原始问题的评论为我指出了一个更富有成效的方向,但这个答案首先澄清了问题所在。谢谢
(.*):\n((?:- .*\n)*)
result = {k: v.split('\n') for k, v in re.findall('(.*):\n((?:- .*\n)*)', text)}