Python 将动态字符串拆分为键值对

Python Split dynamic string to key value pairs

我需要一些帮助。
我有这样的动态字符串:

S31
S4
S2M1L10XL8
S1M2L0XL0
S0M5L6XL8

并需要将其更改为键值,例如:

{"S":31}
{"S":4}
{“S”:2,“M”:1,“L”:10,“XL”:8}
{“S”:1,“M”:2,“L”:0,“XL”:0}
{“S”:0,“M”:5,“L”:6,“XL”:8}

我试试

new_string = re.findall('(\d+|[A-Za-z]+)', string)

但是找不到锄头解决

试试这个:

dict(re.findall('(\D+)(\d+)',your_string))
>>> s = "S2M1L10XL8"
>>> re.findall('(\D+)(\d+)',s)
[('S', '2'), ('M', '1'), ('L', '10'), ('XL', '8')]

第一个捕获组 (\D+) \D 匹配任何不是数字的字符(相当于 [^0-9])

  • 在一次和无限次之间匹配前一个令牌,尽可能多的次数,根据需要回馈(贪婪)

第二个捕获组 (\d+) \d 匹配一个数字(相当于[0-9])

  • 在一次和无限次之间匹配前一个令牌,尽可能多的次数,根据需要回馈(贪婪)

https://regex101.com/r/hww2rm/1

正则表达式应匹配字母后跟数字,而不是字母或数字。将它们分别放在一个单独的捕获组中。然后你可以迭代它并使用字典理解来

new_dict = {name.upper(): int(num) for name, num in re.findall(r'([A-Z]+)(\d+)', string, flags=re.I)}

您的正则表达式用法没问题,下面是一种使其工作的方法:

it = iter(re.findall('(\d+|[A-Za-z]+)', string))
result = dict(zip(it, map(int, it)))