如何用正则可靠提取嵌套JSON中最低层级的数值类型值?
提取嵌套JSON最低层级数值的可靠方案
问题核心
原正则的缺陷在于两个点:一是匹配边界只考虑了后续有键值对的情况,漏了对象最后一个值和数组元素;二是没排除JSON字符串内容里的数字,导致误匹配。
方案一:修正正则(保留原数值匹配逻辑)
如果一定要用正则,得先解决字符串干扰问题,再调整匹配边界:
- 先清除字符串内容的干扰
用正则匹配所有JSON字符串(包括转义双引号),替换成空字符串占位,避免字符串里的数字被误抓:
"(\\"|[^"])*"
把匹配到的内容替换成"",这样字符串里的:1,这类内容就被剔除了。
- 修正数值匹配的正则边界
原正则的正向断言只覆盖了后续有键值对的场景,改成兼容对象结尾}、数组结尾]和下一个元素分隔符,的情况,修正后的正则:
(?<=:)\s*([+-]?\d+(?:\.\d*(?:E-?\d+)?)?)\b\s*(?=(?:,|}|]))
这个正则能匹配对象最后一个值、数组里的所有数值,同时不会碰字符串里的内容。
方案二:解析JSON后遍历(最可靠)
正则解析JSON天生有局限性,比如遇到复杂转义、嵌套结构很容易出错,最稳妥的方式是先把JSON解析成对应的数据结构,再递归遍历提取最低层级的数值。
以Python为例:
def get_bottom_numbers(obj): nums = [] def traverse(item): # 直接判断是否是数值类型 if isinstance(item, (int, float)): nums.append(item) # 遍历数组元素 elif isinstance(item, list): for elem in item: traverse(elem) # 遍历对象的所有值 elif isinstance(item, dict): for val in item.values(): traverse(val) traverse(obj) return nums # 示例用法 import json test_json = '{"a": 123, "b": {"c": 45.6, "d": [78, 90.1e-2]}, "e": ":1,"}' data = json.loads(test_json) print(get_bottom_numbers(data)) # 输出 [123, 45.6, 78, 0.901]
这个方法完全不受字符串内容影响,能精准提取所有合法的数值类型,包括科学计数法格式的数值。
内容的提问来源于stack exchange,提问作者user15555955
相关产品推荐
相关产品推荐

