我有一个包含重复部分的字符串:
s = '[1][2][5] and [3][8]'
我想使用re.match
将这些数字分组到两个列表中,预期结果是:
{'x': ['1', '2', '5'], 'y': ['3', '8']}
我试过这个表达式,但得到了错误的结果:
re.match(r'^(?:\[(?P<x>\d+)\])+ and (?:\[(?P<y>\d+)\])+$', s).groupdict()
# {'x': '5', 'y': '8'}
看起来re.match
只保留最后一个匹配项。如何将所有部分收集到一个列表中,而不是只保留最后一个匹配项?
当然,我知道我可以在' and '
分隔符上拆分行,并使用re.findall
作为部分,但这种方法不够通用,因为它给更复杂的字符串带来了一些问题,所以我总是需要考虑正确的拆分。
3条答案
按热度按时间u5rb5r591#
这里我们可以使用正则表达式。首先,迭代输入字符串,寻找
[3][8]
类型的匹配项。对于每个匹配项,使用re.findall
生成一个数字字符串列表。然后,添加一个键,其值为该列表。注意,我们维护一个键列表,并在使用它时弹出每个键。vc9ivgsu2#
正则表达式
\d+
匹配一个或多个数字,findall()
函数返回所有匹配项的列表,然后字典解析将数字分组到所需的列表x
和y
中。hjzp0vay3#
如果要使用命名的捕获组,可以编写如下模式:重复命名组内方括号之间的数字。
然后,您可以使用re.findall从groupdict中获取值,并首先检查是否存在与模式匹配的值:
参见regex demo
示例
产出