使用正则表达式从字符串中获取键=值对

Get key=value pairs from a string with regex

我有一个看起来像这样的字符串:

x = """\
names=['m','c'],  \
nmodes=2,  \
mus=[[-5.0,  -5.0],  \
[5.0,  5.0]],  \
sigmas=[[1.5,  1.5],  [2.1,  2.1]],  \
corrcoefs=[[[1.0,  -0.7],  [-0.7,  1.0]],  [[1.0,  0.7],  [0.7,  1.0]]],  \
covs=[[[2.25,  -1.5749999999999997],  [-1.5749999999999997,  2.25]],  [[4.41,  3.087],  [3.087,  4.41]]],  \
weights=[1.0,  3.0],  \
bounds={'m': (-inf,  inf),  'c': (-inf,  inf)}\
"""

我想使用“=”作为分隔符将其拆分为键值对,每对之间用逗号分隔 ","

我已经使用 re:

尝试了以下操作
import re

re.findall("(\S+)=(\[.*\]$|{.*}$|\S+)", x)

给出:

[('names', "['m','c'],"),
 ('nmodes', '2,'),
 ('mus', '[[-5.0,'),
 ('sigmas', '[[1.5,'),
 ('corrcoefs', '[[[1.0,'),
 ('covs', '[[[2.25,'),
 ('weights', '[1.0,'),
 ('bounds', "{'m': (-inf,  inf),  'c': (-inf,  inf)}")]

但有些列表被截断了。输出似乎根据列表中逗号后的空格数而变化,但我想让它在逗号后使用任意数量的空格。

您可以使用

re.findall(r'(\w+)=(\[.*?]|{.*?}|\S+)(?=\s*,\s*\w+=|\Z)', text)

regex demo详情:

  • (\w+) - 第 1 组:一个或多个单词字符
  • = - 一个 = 字符
  • (\[.*?]|{.*?}|\S+) - 第 2 组:[,除换行字符外的任何零个或多个字符,尽可能少,],或 {,任何换行符以外的零个或多个字符,尽可能少,},或一个或多个 non-whitespace 个字符
  • (?=\s*,\s*\w+=|\Z) - 正向前瞻,需要用零个或多个空格、一个或多个单词字符、= 或字符串结尾括起来的逗号。