无法将列表中的最后一项与正则表达式匹配

Cannot match last item in list with regular expression

提问人:tutizeri 提问时间:4/10/2018 最后编辑:tutizeri 更新时间:4/11/2018 访问量:266

问:

我需要使用 Python 中的正则表达式检测以下键/值对:

key_title=[a3;d2;g5;a5]

值是用“;”分隔的元素列表

...但它不起作用,因为 <values> 中的最后一个元素不以“;”结尾

我有这个python正则表达式:

(?P<key_values_pair>^(?P<text>\w+)\s*=\s*\[(?P<values>[a-zAZ]\d;)+\])

和这个数据匹配

title=[a3;d2;g5;a5] #comment
# other comment
some_key=[j7;k9]
正则表达式 python-3.x

评论

0赞 Pedro Lobito 4/10/2018
你的密钥/对从何而来,之后你想用它做什么?我不清楚你想用你的代码实现什么。
0赞 tutizeri 4/10/2018
@Pedro Lobito,我没有制作文件格式。很明显:[key]=[array]。我需要读取数组。
0赞 Pedro Lobito 4/10/2018
你说的是哪种文件格式?!我没有关注您的问题或评论。
0赞 tutizeri 4/11/2018
@Pedro Lobito 我没有注意到我需要特殊的格式来编写<值> (<值>)。这是混乱的根源吗?我习惯于从 .NET 正则表达式恢复 <values> 的所有实例。我不知道 Python 无法做到这一点。也许这就是混乱的根源?

答:

0赞 aliaksei 4/10/2018 #1

为什么不简单地将分号设置为可选,如下所示:

(?P<key_values_pair>^(?P<text>\w+)\s*=\s*\[(?P<values>[a-zAZ]\d;?)+\])

评论

0赞 tutizeri 4/11/2018
由于无法像在 .NET 正则表达式中那样恢复所有匹配的<值>,因此我会选择您的答案作为最佳答案,但它无法匹配所有出现的键值对 regex101.com/r/hdmn3s/3
1赞 Scott Weaver 4/10/2018 #2

这似乎有效,我稍微简化了一下,使分号可选:

(?P<key>\w+)=\[(?P<values>(\w+\d;?)+)\]

Regex101 演示

评论

0赞 tutizeri 4/10/2018
但它将所有<值>捕获为一个匹配项(列表),而不是匹配键值对中的每个值
1赞 Casimir et Hippolyte 4/10/2018
@tutizeri:无法使用 RE 模块获取单个匹配列表,因为当您重复一个捕获组时,前一个捕获会被下一个捕获覆盖。您所能做的就是在括号之间描述所有内容,并在之后拆分。您还可以使用能够处理重复捕获的正则表达式模块
1赞 tutizeri 4/10/2018
致读者:相关信息在这里 regular-expressions.info/captureall.html