为了账号安全,请及时绑定邮箱和手机立即绑定

使用正则表达式根据限制字符分割字符串

使用正则表达式根据限制字符分割字符串

慕田峪4524236 2023-10-26 15:49:23
我有一个问题,我需要使用给定的字符串构建一个 Python 字典。该字符串具有一定的模式,如下所示:string = 'streetName=BENEDITO DE PAULA, QD 03 LT 03, state=AM, complement=SJ BANDEIRANTES, number=4, country=BRA'分割不能用逗号来完成,因为文本中间有一个逗号需要变成字符串。我需要通过生成下面的列表来完成拆分,以便稍后它成为字典。字典的键是每个相等的正弦(=)的分隔符,值是后续文本。list = ['streetName=BENEDITO DE PAULA, QD 03 LT 03', 'state=AM', 'complement=SJ BANDEIRANTES', 'number=4', 'country=BRA']所以我需要从正则表达式生成一个列表,我认为应该考虑文本(, TEXT=)然后我将生成一个字典如下dict(v.split("=") for v in re.split("(REGEX)", string))正在使用下面的功能,但它不能解决这种情况下的问题def convert_to_json(x):    dic = dict(v.split("=") for v in x.split(","))    return json.dumps({k.strip():v for (k,v) in dic.items()})
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以在模式上进行拆分\w+=,因为您知道键不包含非单词字符,并捕获拆分字符。这会给你留下尾随空格和逗号,但这并不难清理:


import re


string = 'streetName=BENEDITO DE PAULA, QD 03 LT 03, state=AM, complement=SJ BANDEIRANTES, number=4, country=BRA'


pairs = re.split(r'(\w+=)', string)[1:]   

[a + b.strip(', ') for a, b in zip(pairs[::2], pairs[1::2])]

结果是 :


['streetName=BENEDITO DE PAULA, QD 03 LT 03',

 'state=AM',

 'complement=SJ BANDEIRANTES',

 'number=4',

 'country=BRA']


查看完整回答
反对 回复 2023-10-26
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这里写正则表达式会很困难,因为贪婪匹配会匹配太多逗号,非贪婪匹配会匹配太少逗号。相反,我会通过用逗号分割文本来解决这个问题,然后检查每个子字符串以查看它是否包含等号。


def convert_to_dict(s):

    raw_items = s.split(", ")

    items = []

    for item in raw_items:

        if "=" in item:

            items.append(item)

        elif len(items) > 0:

            items[-1] += ", " + item

        else:

            raise ValueError("Invalid string: dictionary keys cannot contain commas")

    result = {}

    for item in items:

        key, value = item.split("=", maxsplit=1)

        result[key] = value

    return result


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信