Python数据匹配教程:利用正则表达式关联JSON与文本文件信息

Python数据匹配教程:利用正则表达式关联JSON与文本文件信息

本教程详细介绍了如何使用Python高效地从结构化的JSON文件和非结构化的文本文件中匹配并提取关联数据。我们将重点讲解如何利用正则表达式从文本中精确提取关键信息,并结合JSON解析技术,实现跨文件的数据查找与信息关联,最终输出匹配项的详细URL等字段。

引言

在数据处理的日常工作中,我们经常会遇到需要从不同来源、不同格式的数据中进行信息匹配和提取的需求。例如,可能需要根据一个纯文本文件中记录的名称,去一个复杂的json结构中查找对应的详细信息。本教程将以一个具体的场景为例,演示如何使用python结合json模块和re(正则表达式)模块,高效地完成这一任务。

数据准备

为了更好地演示,我们首先准备两份示例数据:一份JSON文件(test.json)和一份纯文本文件(test.txt)。

JSON数据结构 (test.json)

我们的JSON文件包含一个results列表,其中每个元素代表一个设备连接信息。每个连接包含一个主url和termination_a对象,termination_a内部又嵌套了device信息,其中device对象含有name字段,这是我们进行匹配的关键。

{    "results": [        {            "url": "https://api.server.com/cables/100/",            "termination_a": {                "url": "https://api.server.com/interfaces/250/",                "device": {                    "url": "https://api.server.com/devices/10/",                    "display": "device-number1-2023-08 myname (1718)",                    "name": "device-number1-2023-08 myname"                }            }        },        {            "url": "https://api.server.com/cables/200/",            "termination_a": {                "url": "https://api.server.com/interfaces/160/",                "device": {                    "url": "https://api.server.com/devices/22/",                    "display": "device-number3-2023-08 myname (2245)",                    "name": "device-number1-2023-08 myname1"                }            }        },        {            "url": "https://api.server.com/cables/300/",            "termination_a": {                "url": "https://api.server.com/interfaces/260/",                "device": {                    "url": "https://api.server.com/devices/73/",                    "display": "device-number8-2023-08 myname (3678)",                    "name": "device-number8-2023-08 myname"                }            }        }    ]}

文本数据结构 (test.txt)

文本文件包含多行描述性文字,每行中都嵌入了一个设备名称。我们需要从这些非结构化的句子中提取出设备名称。

this is device-number1-2023-08 myname1 and it is good.this is device-number3-2023-08 myname3 and it is not good.this is device-number8-2023-08 myname8 and it is.

核心实现步骤

我们将通过以下几个步骤来实现数据匹配和提取:

立即学习“Python免费学习笔记(深入)”;

加载数据:分别读取JSON文件和文本文件的内容。从文本文件中提取设备名称:利用正则表达式从文本内容中精确匹配并提取所有设备名称。在JSON数据中查找匹配项:遍历JSON结构,将提取到的设备名称与JSON中的设备名称进行比对。提取并输出关联信息:一旦找到匹配项,提取JSON中对应的url和termination_a下的url信息。

完整代码示例

以下是实现上述功能的Python代码:

import jsonimport re# 1. 加载数据try:    with open("test.json", "r", encoding="utf-8") as json_file:        json_data = json.load(json_file)except FileNotFoundError:    print("错误:test.json 文件未找到。")    exit()except json.JSONDecodeError:    print("错误:test.json 文件格式不正确。")    exit()try:    with open("test.txt", "r", encoding="utf-8") as text_file:        text_content = text_file.read()except FileNotFoundError:    print("错误:test.txt 文件未找到。")    exit()# 2. 从文本文件中提取设备名称# 定义正则表达式模式来匹配设备名称,例如 "device-number1-2023-08 myname1"# 模式解释:# device-: 匹配字面字符串 "device-"# w+: 匹配一个或多个字母、数字或下划线 (例如 "number1", "2023", "08", "myname")# d+: 匹配一个或多个数字# s: 匹配一个空格# ():捕获组,re.findall 将返回匹配到的组内容device_name_pattern = r"(device-w+-d+-d+sw+)"txt_device_names = re.findall(device_name_pattern, text_content)print(f"从文本文件中提取到的设备名称: {txt_device_names}n")# 3. 在JSON数据中查找匹配项并提取信息# 4. 提取并输出关联信息if "results" in json_data and isinstance(json_data["results"], list):    found_matches = False    for item in json_data["results"]:        try:            json_device_name = item["termination_a"]["device"]["name"]            # 检查JSON中的设备名称是否在文本文件中提取到的名称列表中            if json_device_name in txt_device_names:                found_matches = True                print(f"找到匹配设备: {json_device_name}")                print(f"  主URL: {item['url']}")                print(f"  终止A URL: {item['termination_a']['url']}")                print(f"  终止A设备URL: {item['termination_a']['device']['url']}n")        except KeyError as e:            print(f"警告:JSON数据结构不完整,缺少键 '{e}'。跳过此项。")            continue    if not found_matches:        print("未找到任何匹配的设备名称。")else:    print("错误:JSON数据结构不符合预期,缺少 'results' 列表。")

代码解析

导入模块:

json: 用于处理JSON格式的数据,包括从文件中加载和解析JSON字符串。re: Python的正则表达式模块,用于在字符串中进行模式匹配和搜索。

加载数据:

代码首先尝试打开并读取 test.json 文件,使用 json.load() 将其内容解析为一个Python字典。接着,打开并读取 test.txt 文件,使用 text_file.read() 将其全部内容读取为一个字符串。为了增强健壮性,这里添加了 try-except 块来处理 FileNotFoundError(文件不存在)和 json.JSONDecodeError(JSON格式错误)等常见异常。

从文本文件中提取设备名称:

device_name_pattern = r”(device-w+-d+-d+sw+)”: 定义了一个原始字符串(r””)形式的正则表达式模式。device-: 字面匹配字符串 “device-“。w+: 匹配一个或多个字母、数字或下划线字符。这可以匹配 number1、2023、08、myname 等部分。d+: 匹配一个或多个数字。s: 匹配一个空白字符(例如空格)。(): 捕获组。re.findall() 函数会返回所有匹配到的捕获组的内容。txt_device_names = re.findall(device_name_pattern, text_content): 使用 re.findall() 在 text_content 字符串中查找所有符合 device_name_pattern 模式的子字符串,并将它们作为一个列表返回。这个列表 txt_device_names 将包含所有从文本文件中提取到的设备名称。

在JSON数据中查找匹配项并提取信息:

代码首先检查 json_data 是否包含 results 键且其值为一个列表,这是为了确保JSON结构符合预期。for item in json_data[“results”]:: 遍历JSON数据中 results 列表的每一个字典项。json_device_name = item[“termination_a”][“device”][“name”]: 逐级访问字典,提取当前JSON项中的设备名称。这里也使用了 try-except KeyError 来处理可能由于JSON结构不完整而导致的键不存在错误。if json_device_name in txt_device_names:: 这是一个高效的匹配操作。它检查从JSON中提取的 json_device_name 是否存在于之前从文本文件提取的 txt_device_names 列表中。如果找到匹配项,则打印出匹配的设备名称以及其对应的 url、termination_a 下的 url 和 termination_a 下 device 的 url。

注意事项与最佳实践

正则表达式的精确性: 正则表达式是此解决方案的关键。一个精确的正则表达式可以确保从非结构化文本中正确提取所需信息。如果文本格式有变化,需要相应调整正则表达式。错误处理: 在实际应用中,文件读写和JSON解析都可能遇到错误(如文件不存在、JSON格式不正确、缺少关键键等)。使用 try-except 块可以使程序更加健壮。数据量: 对于非常大的文本文件,一次性读取整个文件到内存(text_file.read())可能不是最佳选择。可以考虑逐行读取并处理,或者使用 re.finditer() 来迭代匹配结果,避免一次性加载所有匹配项到内存。性能: 将文本文件中所有待匹配的名称预先提取到一个集合(set)中,而不是列表,可以提高查找效率(if name in my_set 的平均时间复杂度为 O(1),而 if name in my_list 为 O(n))。在本例中,由于名称数量可能不大,列表的性能影响不明显,但对于大规模数据,这是一个值得考虑的优化。编码: 在打开文件时指定 encoding=”utf-8″ 是一个好习惯,可以避免因编码问题导致的文件读取错误。

总结

本教程展示了如何利用Python的json模块和re模块,有效地从不同格式的数据源(JSON和纯文本)中进行数据匹配和信息提取。通过精确的正则表达式提取关键信息,并结合结构化数据的遍历,我们可以实现复杂的数据关联任务。掌握这些技术对于处理异构数据源和构建数据处理管道至关重要。

以上就是Python数据匹配教程:利用正则表达式关联JSON与文本文件信息的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PyMySQL连接TypeError解析:掌握正确的参数传递方式
上一篇 2025年12月14日 16:04:57
比较Pandas DataFrame中含NaN浮点数列的差异计数
下一篇 2025年12月14日 16:05:11

相关推荐

  • Java正则表达式:利用词边界实现精确的非贪婪字符串替换

    Java正则表达式:利用词边界实现精确的非贪婪字符串替换Java正则表达式:利用词边界实现精确的非贪婪字符串替换Java正则表达式:利用词边界实现精确的非贪婪字符串替换Java正则表达式:利用词边界实现精确的非贪婪字符串替换

    本教程探讨如何在Java中使用正则表达式精确替换字符串中的特定部分,特别是在目标字符串不应消耗后续字符的场景。通过分析常见错误,文章详细介绍了词边界的原理与应用,展示了如何利用它实现非贪婪且不破坏原字符串结构的替换,确保匹配的精确性与替换结果的完整性。 在处理字符串替换时,我们经常面临需要精确匹配特…

    2026年9月24日 用户投稿
    700
  • Agent Zero— 开源可扩展AI框架,通过用户指令和任务动态学习

    Agent Zero— 开源可扩展AI框架,通过用户指令和任务动态学习Agent Zero— 开源可扩展AI框架,通过用户指令和任务动态学习Agent Zero— 开源可扩展AI框架,通过用户指令和任务动态学习Agent Zero— 开源可扩展AI框架,通过用户指令和任务动态学习

    agent zero 是一个开源的、可扩展的人工智能框架,能够作为用户的个性化智能助手。它不是基于预设功能的工具,而是通过用户指令和任务来动态学习与成长。agent zero 具备持久记忆能力,可以存储过往的解决方案、代码和事实信息,从而更快速地应对未来的任务。该框架将操作系统视为执行任务的工具,具…

    2026年9月24日 用户投稿
    100
  • 全国首家5G-A移动申花联名厅落地:手机独显8字运营商Logo

    全国首家5G-A移动申花联名厅落地:手机独显8字运营商Logo全国首家5G-A移动申花联名厅落地:手机独显8字运营商Logo全国首家5G-A移动申花联名厅落地:手机独显8字运营商Logo全国首家5G-A移动申花联名厅落地:手机独显8字运营商Logo

    9月27日,全国首个“5G-A移动申花联名厅”在上海市长宁区中山公园商圈正式亮相。 该联名厅由上海移动与上海申花足球俱乐部共同打造,整体设计以象征球队的“申花蓝”为主色调,营造出浓厚的足球文化氛围。 此次合作推出了多项创新服务,其中主打产品为“5G-A申花球迷专享包”。该套餐融合了上海移动先进的5G…

    2026年9月24日 用户投稿
    000
  • sublime怎么安装字体并应用_sublime更换与应用新字体方法

    sublime怎么安装字体并应用_sublime更换与应用新字体方法sublime怎么安装字体并应用_sublime更换与应用新字体方法sublime怎么安装字体并应用_sublime更换与应用新字体方法sublime怎么安装字体并应用_sublime更换与应用新字体方法

    先在操作系统安装字体文件,再通过Sublime Text设置中的font_face指定字体名称即可应用。1. 将.ttf或.otf字体文件安装到系统:Windows右键安装,macOS双击后点击“安装字体”,Linux复制到~/.fonts并运行fc-cache -fv更新缓存。2. 重启Subli…

    2026年9月24日 用户投稿
    100
  • windows右键新建菜单没有word或excel怎么办 右键新建菜单找回word和excel的方法

    windows右键新建菜单没有word或excel怎么办 右键新建菜单找回word和excel的方法windows右键新建菜单没有word或excel怎么办 右键新建菜单找回word和excel的方法windows右键新建菜单没有word或excel怎么办 右键新建菜单找回word和excel的方法windows右键新建菜单没有word或excel怎么办 右键新建菜单找回word和excel的方法

    若Windows右键“新建”缺失Word或Excel选项,首先检查Office安装完整性,通过“快速修复”或“联机修复”恢复;若无效,可手动在注册表中添加对应ShellNew项并创建NullFile或FileName字符串值;也可使用.reg批处理脚本自动注入注册表;最后重建.docx和.xlsx文…

    2026年9月24日 用户投稿
    100
  • Android应用中通过下载链接从Firebase Storage下载文件教程

    Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程

    本教程详细介绍了在Android应用中如何利用文件的下载URL,结合Android DownloadManager将Firebase Storage中的文件下载到用户设备指定目录。内容涵盖必要的运行时权限处理、清单文件配置以及DownloadManager的具体使用方法,旨在帮助开发者实现本地文件存…

    2026年9月24日 用户投稿
    300
  • sublime的session文件是做什么用的_sublime会话文件作用与恢复机制

    sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制

    Sublime Text的session文件记录了打开的文件、光标位置、代码折叠状态、窗口布局及未保存内容等信息,位于系统特定目录下的Local文件夹中,以JSON格式存储,通过自动保存机制在重启后恢复编辑状态。 Sublime Text 的 session 文件主要用于保存用户当前编辑环境的状态信…

    2026年9月24日 用户投稿
    000
  • windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法

    windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法

    首先检查系统文件完整性,运行sfc /scannow修复损坏文件;若为家庭版系统,使用DISM命令安装组策略组件;接着通过注册表编辑器修改MMC相关限制策略;最后尝试直接从System32目录运行gpedit.msc文件。 如果您尝试通过运行命令打开Windows 10的组策略编辑器(gpedit.…

    2026年9月24日 用户投稿
    200
  • DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成

    DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成

    很多用户好奇,像DeepSeek这样的AI模型能否帮助完成编程任务,特别是那些相对简单的编程需求。答案是肯定的。DeepSeek具备理解自然语言描述并尝试生成相应代码的能力,这使得它成为完成一些简单编程任务的有力工具。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月24日 用户投稿
    200
  • 高质量免费logo设计网站 国产免费logo生成工具推荐

    国产免费Logo设计网站推荐即时设计、DesignEvo、牛人设计等,这些平台提供海量模板、支持中文输入与AI智能生成,具备全中文界面、本土化元素和矢量导出功能,适合零基础用户快速制作高质量Logo。 高质量免费logo设计网站国产免费logo生成工具推荐这是不少网友都关注的接下来由PHP小编为大家…

    2026年9月24日
    300
  • 如何通过BIOS调整CPU电压实现节能?

    答案:CPU降压通过BIOS调整Vcore电压,采用Offset模式在保证稳定前提下降低功耗与温度,提升能效;需结合HWiNFO64等工具监控温度、功耗,并用Prime95等压力测试验证稳定性,避免蓝屏或崩溃,合理设置可使CPU在更低温度下维持更高睿频,实现节能且不牺牲性能。 通过BIOS调整CPU…

    2026年9月24日
    900
  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    100
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000
  • 星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法

    星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法

    星痕共鸣捏脸码导入位置说明 1、具体操作:在进入角色捏脸界面后,左下角会显示【下载】与【分享】两个功能按钮。点击【下载】即可输入他人提供的捏脸码,快速导入并应用对应的角色外观。 2、此外,玩家也可以通过【分享】生成自己的捏脸数据编码,供其他玩家使用。若对当前形象不满意,还可使用【生体重构剂】道具将角…

    2026年9月24日 用户投稿
    600
  • 德系豪华品牌集体投“华” 是什么让BBA放下了身段?

    德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?

      【小编科技】当德系豪华车徽章与中国科技基因交融,当国资巨头的生产线接入鸿蒙神经中枢,当售价20万元的汽车装上百万级智驾系统——华为正以”技术赋能者”的姿态重构产业格局,成为名副其实的行业顶流。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

    2026年9月24日 用户投稿
    500
  • APM开发阅读

    APM开发阅读APM开发阅读APM开发阅读APM开发阅读

    我阅读apm的源码有两个主要目的:一是学习,了解飞控系统和大型项目的组织结构;二是为了移植的需要,满足项目需求。近年来,少儿编程市场非常火热,许多厂商推出了相关的产品,但这些产品大多使用空心杯电机,导致动力不足,且扩展性有限。许多任务需要io或图像识别的支持。 因此,我在考虑使用APM裁剪版的飞控系…

    2026年9月24日 用户投稿
    1700
  • VSCode的扩展设置是全局的还是局部的?

    VSCode扩展设置默认全局生效,存储于用户配置文件中,但部分扩展如ESLint、Prettier和Python支持项目级局部配置,通过在项目根目录的.vscode/settings.json文件中定义,可覆盖全局设置;在设置界面中,齿轮图标表示可被工作区覆盖,锁图标表示仅限全局修改,用户可根据需求…

    2026年9月24日
    300
  • laravel怎么配置Octane并选择Swoole或RoadRunner_laravel Octane Swoole/RoadRunner配置方法

    Laravel Octane通过Swoole或RoadRunner提升应用性能,需安装扩展包并发布配置文件;选择Swoole需安装PHP扩展并设置driver为’swoole’,启动服务时可加–watch实现热重载;选择RoadRunner则自动安装二进制文件,配…

    2026年9月24日
    200
  • Python创建模块并调用函数

    在PyCharm中创建新项目后,于项目根目录下新建一个名为 jisuanqi.py 的Python脚本文件。 在该文件中定义一个函数 ys,该函数包含三个形参:a、b 和 c。其中,a 与 b 为参与数学运算的操作数,c 用于指定运算类型——当值为0时执行加法,1时为减法,2时为乘法,3时则进行除法…

    2026年9月24日
    100
  • 解决MySQL事件event定义中文乱码的方法

    mysql的event事件处理中文乱码问题主要由字符集设置不当引起,解决方法包括以下步骤:1. 统一数据库、表和字段的字符集为utf8mb4,创建或修改时显式指定字符集;2. 设置连接层字符集,在连接后执行set names ‘utf8mb4’或在程序连接参数中指定chars…

    2026年9月24日
    400

发表回复

登录后才能评论
关注微信