使用正则表达式从字符串中获取键=值对
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)
- 正向前瞻,需要用零个或多个空格、一个或多个单词字符、=
或字符串结尾括起来的逗号。
我有一个看起来像这样的字符串:
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)
- 正向前瞻,需要用零个或多个空格、一个或多个单词字符、=
或字符串结尾括起来的逗号。