Python:正则表达式与Json

Python:正则表达式与Json -- WhiteNight's Site

标签:python

将正则表达式应用到json文件中

来看看如何将正则表达式应用到json文件的处理中。

前情提要
识别时间戳

以自动化流程为例,比如屏幕上有一个时间戳,我需要先对当前屏幕截图,再通过RapidOCR-Json得到这张截图的OCR数据。最后再将json文件中有关时间戳的数据写入到excel表格中。

前两步很简单,无非就是cmd调用和重定向。但是后者就比较麻烦。这里给出两条json数据作为例子

复制代码
 ...
{
  "data":[
            "score": 0.9616522789001465,
            "text": "192.168.0.1: 2024-01-26 15:51:31.420"
        },
        {
            "score": 0.8731944213310877,
            "text": "192.168.0.2: 2024-01-26 15:51:31.420"
        },
...
        ]
}

text里面是条时间戳。格式为"IP地址: %y-%m-%d %h:%m:%s.%f"(%f表示毫秒)。那么现在我想把时间戳提取处理,写入到excel表格中,预期的excel结果如下:

|-------------------------|-------------------------|
| 192.168.0.1 | 192.168.0.2 |
| 2024-01-26 15:51:31.420 | 2024-01-26 15:51:31.420 |

预期EXCEL

思路的话倒不是没有。先转成dict,IP作为Key,通过not in来判断字典中有没有这个IP,没有的话就新加上去。再把对应的时间戳加上就行。

转excel的话我估计得用到pandas,最重要的是得做一步行转列的操作,再写入到excel里面。

思路有了,接下来来看看具体代码实现。

模式与数据结构
正则表达式与DataFrame

那首先得看看子任务:json怎么转为dict?

首先是读取,直接json.load完事。接下来是确定"模式"(pattern)。对于我们的时间戳而言,它的模式是

xxx . xxx . xxx . xxx xxx:xxx:xxx.xxx

叫它"模式"也好,"模板"也好,简单来说,哪个字符串能对的上这个模板,那么match的结果就返回true。不过模式都是人为规定的,json格式也是人为规定的。所以也没必要真的按每个标点符号去匹配。

我们的时间戳可以分为前后两个部分。只要前面是IP,IP后面跟着的字符串里面有冒号和点号,点号后面一定接着一串数字,那就可以认为这就是我们要找的时间戳。

pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):\s*(.+)')

接下来再把IP和时间点分别写入到dict中,+-直接append就行。

复制代码
import json
...
...
...
def json_to_excel(json_file_path,ip_dict):
    # 读取JSON文件
    with open(json_file_path, 'r', encoding='UTF-8') as f:
        json_data = json.load(f)

    # 正则表达式匹配IP地址和时间戳
    pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):\s*(.+)')

    # 遍历JSON数据中的 "data" 部分
    for item in json_data.get("data", []):

        text = item.get("text", "")
        match = pattern.match(text)


        if match:
            ip = match.group(1)
            timestamp = match.group(2)
            if ip not in ip_dict:
                ip_dict[ip] = []
            ip_dict[ip].append(timestamp)

到这里还没结束。我们得把字典的数据写入到pandas的数据结构DataFrame中,DataFrame可以简单理解为一张数据表格。

df = pd.DataFrame()

复制代码
# 遍历字典,将IP地址作为列名,时间戳作为数据填充到DataFrame中
for ip_local, timestamps in ip_dict.items():
    df[ip_local] = timestamps

json转excel
DataFrame.to_excel

别人都封装好了,直接写入就行。接下来看看这题的"变种"------假设需求又增加了。

假设我还要新建一列,用来记录同一IP之间每一时间点的差值。至于怎么计算差值,这个看自己情况。可以自己写个字符串转数字作差值的,也可以调to_datatime转数据格式再作差值。

复制代码
def write_to_excel(excel_path):
    # 读取Excel文件到DataFrame
    df = pd.read_excel(excel_path)
    
    for column in df.columns:
            # 将时间字符串转换为datetime对象
            time_data = pd.to_datetime(df[column], format='%Y-%m-%d %H:%M:%S.%f')
            # 计算时间差值,并将结果转换为秒
            time_diff = time_data.diff().dt.total_seconds()
            # 将第一行的时间差值设置为0
            time_diff.iloc[0] = 0
            # 添加新列到DataFrame中,用于存储时间差值
            df[column + '-时间差值'] = time_diff
    
    # 保存修改后的DataFrame回Excel文件
    df.to_excel(excel_path, index=False)
相关推荐
烛阴2 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼3 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开3 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
2301_805054564 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪5 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
微风粼粼6 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上6 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5
你怎么知道我是队长7 小时前
python-input内置函数
开发语言·python
叹一曲当时只道是寻常7 小时前
Python实现优雅的目录结构打印工具
python
百锦再7 小时前
.Net配置文件appsetting.json的几种读取方法
chrome·json·.net·依赖注入·appsetting·web.config