【问题标题】:Python Split dynamic string to key value pairsPython将动态字符串拆分为键值对
【发布时间】:2021-10-27 18:25:48
【问题描述】:

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

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)

但找不到锄头来解决

【问题讨论】:

  • 您的 re.findall 可以帮助您完成大部分工作。现在只需迭代对 (see here) 并从中制作字典。
  • ([A-Z]+)(\d+) 可能是您要开始使用的正则表达式。这将返回类似[('S', '0'), ('M', '5'), ('L', '6'), ('XL', '8')] 的内容,然后您可以将其转换为字典(并将字符串解析为数字)。

标签: python json key-pair


【解决方案1】:

试试这个:

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

【讨论】:

  • 不转换数字字符串。
【解决方案2】:

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

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

【讨论】:

  • 呃,我有一个早期版本,在使用 finditer 时可以做到这一点。简化失去了这一点。
  • @KellyBundy 已更新以进行转换
  • 我也试过finditer,但遗憾的是它只会产生讨厌的 Match 对象。顺便说一句,看看我的回答为什么我不同意你的第一句话:-P
  • 是的,我的原版在字典理解中有 m.group(1).upper()int(m.group(2))
  • 感谢__getitem__
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2011-06-22
    相关资源
    最近更新 更多