regex 在Python标准正则表达式中,如何将值收集到列表中?

pkwftd7m  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(124)

我有一个包含重复部分的字符串:

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作为部分,但这种方法不够通用,因为它给更复杂的字符串带来了一些问题,所以我总是需要考虑正确的拆分。

u5rb5r59

u5rb5r591#

这里我们可以使用正则表达式。首先,迭代输入字符串,寻找[3][8]类型的匹配项。对于每个匹配项,使用re.findall生成一个数字字符串列表。然后,添加一个键,其值为该列表。注意,我们维护一个键列表,并在使用它时弹出每个键。

import re

s = '[1][2][5] and [3][8]'
keys= ['x', 'y']
d = {}
for m in re.finditer('(?:\[\d+\])+', s):
    d[keys.pop(0)] = re.findall(r'\d+', m.group())

print(d)  # {'y': ['3', '8'], 'x': ['1', '2', '5']}
vc9ivgsu

vc9ivgsu2#

import re

s = '[1][2][5] and [3][8]'

# Use a regular expression to extract the numbers from the string
numbers = re.findall(r'\d+', s)

# Group the numbers into a dictionary using a dictionary comprehension
result = {
    'x': numbers[:3],  # First three numbers
    'y': numbers[3:]   # Remaining numbers
}

print(result)  # {'x': ['1', '2', '5'], 'y': ['3', '8']}

正则表达式\d+匹配一个或多个数字,findall()函数返回所有匹配项的列表,然后字典解析将数字分组到所需的列表xy中。

hjzp0vay

hjzp0vay3#

如果要使用命名的捕获组,可以编写如下模式:重复命名组内方括号之间的数字。
然后,您可以使用re.findall从groupdict中获取值,并首先检查是否存在与模式匹配的值:

^(?P<x>(?:\[\d+])+) and (?P<y>(?:\[\d+])+)$

参见regex demo
示例

import re

s = '[1][2][5] and [3][8]'
m = re.match(r'^(?P<x>(?:\[\d+])+) and (?P<y>(?:\[\d+])+)$', s)

if m:
    dct = {k: re.findall(r"\d+", v) for k, v in m.groupdict().items()}
    print(dct)

产出

{'x': ['1', '2', '5'], 'y': ['3', '8']}

相关问题