regex 如何捕获递归分隔的字符串

8e2ybdfx  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(112)

下面是一个JSON字符串:
第一个月
我只想从AUT、RES、RENT和COR的值中删除空格

/"(AUT|COR|RES|SUP)":"((\w*)(\s*)(,*))"/

字符串
我的最佳近似,无法获得并清除RES值
“\1”:“\3”
2019年10月19日,中国科学院院士、中国科学院
有什么想法吗?
谢谢

roqulrg3

roqulrg31#

使用正则表达式解析结构化数据几乎总是会导致不可靠的行为。
相反,你可以创建一个函数,它递归地遍历子字典,并带有一个标志,指示当前键是否在所需键中,以便相应地替换值:

def remove_whitespace(data, keys, replace=False):
    if isinstance(data, dict):
        for key, value in data.items():
            data[key] = remove_whitespace(value, keys, key in keys)
    elif replace:
        data = data.replace(' ', '')
    return data

字符串
以便:

import json

data = '{"main":{"sem":"segon semestre","year":"2021","AUT":"admin  ","RES":"manel , admin ,lectura ","SUP":"kiloton  ","COR":"","fitx":"continguts"}}'
keys = ['AUT', 'RES', 'SUP', 'COR']
print(json.dumps(remove_whitespace(json.loads(data), keys)))


产出:

{"main": {"sem": "segon semestre", "year": "2021", "AUT": "admin", "RES": "manel,admin,lectura", "SUP": "kiloton", "COR": "", "fitx": "continguts"}}


演示:https://ideone.com/Br4rBw

idfiyjo8

idfiyjo82#

使用 json.loads 函数将JSON字符串转换为Python字典。
然后只需重新选择相关的键并适当地调整它们的值

from json import loads, dumps

JS = """{"main":{"sem":"segon semestre","year":"2021","AUT":"admin  ","RES":"manel , admin ,lectura ","SUP":"kiloton  ","COR":"   ","fitx":"continguts"}}"""

m = (d := loads(JS))["main"]

for key in "AUT", "RES", "SUP", "COR":
    m[key] = m[key].replace(" ", "")

print(dumps(d, indent=2))

字符串

输出:

{
  "main": {
    "sem": "segon semestre",
    "year": "2021",
    "AUT": "admin",
    "RES": "manel,admin,lectura",
    "SUP": "kiloton",
    "COR": "",
    "fitx": "continguts"
  }
}

备注:

这个问题似乎要求一个递归的解决方案,但我不知道为什么这是必要的

相关问题