python解析json串与正则匹配对比

本文对比了使用JSON解析和正则表达式两种方法来提取大量数据中的特定字段的效率。通过实验证明,在大数据环境下,正则表达式的速度远超JSON解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

现在有如下格式的json串:
“detail_time”:“2016-03-30 16:00:00”,“device_id”:“123456”,“os”:“Html5Wap”,“session_flow_id”:“1d1819f3-8e19-4597-b50d-ba379adcd8e5”,“user_longitude”:0.0000,“user_latitude”:0.0000,“search_id”:xxx,“search_guid”:-543326548,“search_type”:7,“AAA”:4,“BBB”:-1,“CCC”:[],“DDD”:3,“EEE”:2,“FFF”:1459267200,“GGG”:1459353600,“aaa”:90954603,“bbb”:[{“xxx”:1500848,“x”:1,“bf”:0,“pp”:2,“sroom”:2,“ppp”:108,“cost”:97.2,“coupon”:108,“drr”:108},{“xxx”:1500851,“x”:1,“bf”:0,“pp”:1,“sroom”:2,“ppp”:108,“cost”:97.2,“coupon”:108,“drr”:108},{“xxx”:2336691,“x”:1,“bf”:1,“pp”:1,“sroom”:3,“ppp”:199,“cost”:169.15,“coupon”:191,“drr”:199},{“xxx”:2336692,“x”:1,“bf”:1,“pp”:2,“sroom”:4,“ppp”:102,“cost”:91.8,“coupon”:102,“drr”:102},{“xxx”:1500848,“x”:1,“bf”:0,“pp”:2,“sroom”:3,“ppp”:118,“cost”:106.2,“coupon”:118,“drr”:118},{“xxx”:1500851,“x”:1,“bf”:0,“pp”:1,“sroom”:3,“ppp”:118,“cost”:106.2,“coupon”:118,“drr”:118},{“xxx”:2336693,“x”:1,“bf”:1,“pp”:1,“sroom”:5,“ppp”:199,“cost”:169.15,“coupon”:191,“drr”:199},{“xxx”:2336694,“x”:1,“bf”:1,“pp”:2,“sroom”:6,“ppp”:112,“cost”:100.3,“coupon”:112,“drr”:112},{“xxx”:1500848,“x”:1,“bf”:0,“pp”:2,“sroom”:1,“ppp”:98,“cost”:88.2,“coupon”:98,“drr”:98},{“xxx”:1500851,“x”:1,“bf”:0,“pp”:1,“sroom”:1,“ppp”:98,“cost”:88.2,“coupon”:98,“drr”:98},{“xxx”:2336687,“x”:1,“bf”:1,“pp”:1,“sroom”:1,“ppp”:189,“cost”:160.65,“coupon”:182,“drr”:189},{“xxx”:2336689,“x”:1,“bf”:1,“pp”:2,“sroom”:2,“ppp”:93,“cost”:83.3,“coupon”:93,“drr”:93},{“xxx”:1500848,“x”:1,“bf”:0,“pp”:2,“sroom”:4,“ppp”:128,“cost”:115.2,“coupon”:128,“drr”:128},{“xxx”:1500851,“x”:1,“bf”:0,“pp”:1,“sroom”:4,“ppp”:128,“cost”:115.2,“coupon”:128,“drr”:128},{“xxx”:2336695,“x”:1,“bf”:1,“pp”:1,“sroom”:7,“ppp”:239,“cost”:203.15,“coupon”:230,“drr”:239},{“xxx”:2336696,“x”:1,“bf”:1,“pp”:2,“sroom”:8,“ppp”:121,“cost”:108.8,“coupon”:121,“drr”:121}],“ppp_min”:93.00,“ppp_max”:239.00,“ppp_avg”:134.88,“ppp_med”:118.00,“ppp_min_cost”:83.30,“ppp_min_promotion_type”:-1,“ppp_min_promotion_amount”:-1,“bf_ppp_min”:149.00,“bf_ppp_min_cost”:83.30,“bf_ppp_min_promotion_type”:-1,“bf_ppp_min_promotion_amount”:-1}

现在想拿到device_id的具体值。最简单的方式就是用解析json串的方式得到,代码如下:

#!/usr/bin/env python
#coding:utf-8

import json
import sys
import collections
import time

def t1():
    start = time.clock()
    for line in sys.stdin:
        try:
            line = line.strip()
            decoded = json.loads(line)
            device_id = decoded["device_id"]
            print device_id
        except Exception,ex:
            pass

    end = time.clock()
    print "The cost time is: %f" %(end - start)

t1()

以上代码能顺利完成任务。

不幸的是,现在是大数据时代,数据量嘛,自然都很大。用了一万条数据做测试,耗时达到了惊人的。。。将近10s。

转换下思路,采用正则匹配的方式

#!/usr/bin/env python

import re
import sys
import time

def t1():
    start = time.clock()
    count = 0
    for line in sys.stdin:
        line = line.strip()
        pattern = re.compile("(?:\"device_id\":\")([^\"]+)")
        search = pattern.search(line)
        if search:
            count += 1
            #print search.groups()[0]
    end = time.clock()
    print "The count is: %d" %(count)
    print "The cost time is: %f" %(end - start)

t1()

注意匹配的时候
re.compile("(?:\"device_id\":\")([^\"]+)")
第一个分组表示不捕获,只捕获后面的分组。
同样一万条数据,运行耗时是。。。0.05s。效率提高了多少倍,表示算不过来了。

### JSON格式的正则表达式匹配 对于简单的JSON对象字符,可以构建相对复杂的正则表达式来尝试匹配基本结构。然而需要注意的是,使用正则表达式完全解析或验证复杂嵌套的JSON并不推荐,因为这超出了正则表达式的合理能力范围[^1]。 下面给出一个能够匹配简单键值对形式JSON对象的正则表达式模式: ```python import re json_pattern = r'\{(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?)|(?:\{(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?|\{{1}.*?\}{1})?(?:,(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?|\{{1}.*?\}{1})))*\}))?(?:,(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?|\{{1}.*?\}{1})|(?:\{(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?|\{{1}.*?\}{1})?(?:,(?:\"[\w\s]+\"\:(?:\".*?\"|[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?|\{{1}.*?\}{1})))*\})))*\}' pattern = re.compile(json_pattern) test_json_string = '{"name": "John", "age": 30, "is_student": false}' match_result = pattern.fullmatch(test_json_string.strip()) if match_result is not None: print("The string matches the simple JSON object pattern.") else: print("The string does NOT match the simple JSON object pattern.") ``` 此代码定义了一个`json_pattern`变量保存用于匹配简单JSON对象的正则表达式,并通过`re.compile()`编译该模式以便后续高效利用。测试字符如果能被这个模式完整匹配,则表示它符合所设定的简单JSON格式;反之则不符合。 但是为了更可靠地处理校验JSON数据,在实际项目开发中应该优先考虑采用内置库如`json`模块来进行序列化反序列化的操作而不是依赖于正则表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值