gpt4 book ai didi

python - 将字符串转换为带有内部逗号的字符串字典

转载 作者:行者123 更新时间:2023-12-02 03:35:57 25 4
gpt4 key购买 nike

我正在尝试构建一个正则表达式来转换一个字符串,该字符串将转换它

'{a:bilby.core.prior.Uniform(-1,1,a, func=g(1, 2)),b:2}'

进入

{"a": "Uniform(-1,1,a, func=g(1, 2))", "b": "2"}

请注意,字典的值仍然是字符串(它们随后将由另一个函数解释)

到目前为止,我已经得到了这个

>>> import re
>>> re.sub(r'([A-Za-z/\.0-9\-\+][^\[\],:"}]*)', r'"\g<1>"', '{a:bilby.core.prior.Uniform(-1,1,a, func=g(1, 2)),b:2}')
'{"a":"bilby.core.prior.Uniform(-1","1","a", "func=g(1", "2))","b":"2"}'

但问题是它与括号内的逗号匹配。有没有办法只在括号内不匹配?

我知道正则表达式不支持嵌套括号,这是这里的问题吗?

最佳答案

正如@Giacomo 指出的,嵌套括号需要复杂的正则表达式。您最好推出自己的可以处理每种情况的解析器。您仍然可以使用正则表达式,但不必是“one-regex-to-rule-them-all”。

import re

def comma_partition(s):
"""Partitions `s` at top-level commas"""
s = s.strip('{').strip('}')
in_parens = 0
ixs = []
for i, c in enumerate(s):
if c == '(':
in_parens += 1
if c == ')':
in_parens -= 1
if not in_parens and c == ',':
ixs.append(i)
return [s[sc] for sc in make_partition_slices(ixs)]

def make_partition_slices(ixs):
"""Yields partitioning slices, skipping each index of `ixs`"""
ix_x = [None] + ixs
ix_y = ixs + [None]
for x, y in zip(ix_x, ix_y):
yield slice(x + 1 if x else x, y)

def kv_parser(kv_str):
"""Takes a string in 'K:V' format and returns dictionary.
Leading namespace in `V` is removed.
"""
k, v = kv_str.split(':', 1)
v = re.sub(f'^([A-Za-z_]([A-Za-z0-9_])*\.)+', '', v)
return {k: v}

上面我们定义了 3 个函数,其中一个函数用于查找顶级逗号的索引(不在括号中的逗号)。这是通过简单地计算左括号和右括号来完成的。第二个函数生成切片,将字符串划分为逗号的每个索引的左侧和右侧。第三个是实际的解析器,它分割键和值,并使用简单的正则表达式清理值 namespace 。

下面我们在您的测试用例上运行它。

s = '{a:bilby.core.prior.Uniform(-1,1,a, func=g(1, 2)),b:2}'
out = {}
for p in comma_partition(s):
out.update(kv_parser(p))

out
# returns:
{'a': 'Uniform(-1,1,a, func=g(1, 2))', 'b': '2'}

代码较多,但比复杂的正则表达式更容易修改和维护。

关于python - 将字符串转换为带有内部逗号的字符串字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60183525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com