Python:高效匹配文本与JSON数据并提取关联信息

Python:高效匹配文本与JSON数据并提取关联信息

本教程旨在指导您如何使用Python从JSON文件中根据文本文件中匹配的设备名称提取相应的URL信息。我们将通过加载JSON和文本数据,利用正则表达式从文本中精确提取设备名称,然后遍历JSON结构,查找匹配项并打印出关联的URL。此方法确保了数据处理的准确性和效率,适用于需要从复杂数据源中筛选特定信息的场景。

1. 引言与问题定义

在数据处理的场景中,我们经常需要从不同的数据源中整合信息。本教程将解决一个典型问题:给定一个包含结构化设备信息的json文件,其中包含设备的名称和多个关联url;同时,我们还有一个纯文本文件,其中散布着一些设备名称。我们的目标是读取这两个文件,找出文本文件中提到的设备名称在json中对应的条目,并从中提取特定的url信息(例如设备本身的url和其终止点a的url)。

例如,我们有以下JSON数据 (test.json):

{  "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 myname1"        }      }    },    {      "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-number3-2023-08 myname3"        }      }    },    {      "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 myname8"        }      }    }  ]}

以及以下文本数据 (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.

我们的目标是,当文本文件中的设备名称(例如 “device-number1-2023-08 myname1″)与JSON中 results 列表里每个元素的 termination_a.device.name 字段匹配时,打印出该匹配项的 url 和 termination_a.url。

2. 核心思路与方法

为了实现上述目标,我们将采用以下步骤:

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

加载数据: 读取JSON文件和文本文件内容。提取文本中的设备名称: 使用正则表达式从文本文件中准确地解析出所有设备名称。这种方法比简单的字符串分割更健壮,尤其当文本格式可能不完全固定时。遍历JSON数据: 迭代JSON数据中的每个设备记录。匹配与提取: 对于JSON中的每个设备,检查其名称是否在从文本文件中提取出的设备名称列表中。如果匹配成功,则提取并打印所需的URL信息。

3. 实现步骤与示例代码

3.1 导入必要的库

我们将使用 json 库来处理JSON数据,以及 re 库来处理正则表达式。

import jsonimport re

3.2 加载文件数据

首先,我们需要打开并读取 test.json 和 test.txt 文件。

# 加载 JSON 文件with open("test.json", "r") as json_file:    json_data = json.load(json_file)# 加载文本文件with open("test.txt", "r") as text_file:    text_data = text_file.read()

3.3 使用正则表达式提取文本中的设备名称

这是解决问题的关键一步。文本文件中的设备名称格式为 device-numberX-YYYY-MM mynameX。我们可以设计一个正则表达式来捕获这种模式。

正则表达式 r”(device-w+-d+-d+ w+)” 的解释:

device-: 匹配字面字符串 “device-“。w+: 匹配一个或多个字母、数字或下划线(例如 “number1″)。-d+-d+: 匹配 “-YYYY-MM” 格式,即两个连字符分隔的数字序列。` `: 匹配一个空格。w+: 匹配一个或多个字母、数字或下划线(例如 “myname1″)。(): 捕获组,表示我们想提取这部分匹配到的内容。

# 使用正则表达式从文本中提取所有设备名称# r"(device-w+-d+-d+ w+)" 匹配 "device-numberX-YYYY-MM mynameX" 格式的字符串txt_device_names = re.findall(r"(device-w+-d+-d+ w+)", text_data)print("从文本文件中提取的设备名称:", txt_device_names)# 预期输出: ['device-number1-2023-08 myname1', 'device-number3-2023-08 myname3', 'device-number8-2023-08 myname8']

为了提高查找效率,尤其是当 txt_device_names 列表非常大时,可以将其转换为一个 set。集合的查找操作(in)通常比列表快得多,因为它的平均时间复杂度是 O(1)。

txt_device_names_set = set(txt_device_names)

3.4 遍历JSON并匹配提取信息

现在,我们遍历JSON数据中的 results 列表。对于每个结果项 r,我们获取其 termination_a.device.name,并检查它是否存在于我们从文本文件中提取的设备名称集合中。如果存在,就打印出 r[“url”] 和 r[“termination_a”][“url”]。

print("n匹配到的设备及其URL信息:")for r in json_data["results"]:    json_device_name = r["termination_a"]["device"]["name"]    if json_device_name in txt_device_names_set:        print(f"匹配设备名称: {json_device_name}")        print(f"  主URL: {r['url']}")        print(f"  终止点A的URL: {r['termination_a']['url']}")        # 如果需要,还可以打印设备自身的URL        # print(f"  设备自身的URL: {r['termination_a']['device']['url']}")

4. 完整代码示例

将以上所有代码片段组合起来,形成一个完整的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 文件内容不是有效的JSON格式。")    exit()try:    with open("test.txt", "r", encoding='utf-8') as text_file:        text_data = text_file.read()except FileNotFoundError:    print("错误: test.txt 文件未找到。请确保文件存在于脚本同级目录。")    exit()# 2. 使用正则表达式从文本中提取设备名称# 定义正则表达式模式来匹配设备名称# 例如 "device-number1-2023-08 myname1"device_name_pattern = r"(device-w+-d+-d+ w+)"txt_device_names = re.findall(device_name_pattern, text_data)# 将提取的名称转换为集合,以便更快的查找txt_device_names_set = set(txt_device_names)print("从文本文件中提取的设备名称:", txt_device_names)# 3. 遍历JSON数据,匹配并提取信息print("n匹配到的设备及其URL信息:")found_matches = Falsefor r in json_data["results"]:    # 获取JSON中设备的名称    json_device_name = r["termination_a"]["device"]["name"]    # 检查JSON中的设备名称是否在文本文件中提取的名称集合中    if json_device_name in txt_device_names_set:        found_matches = True        print(f"--------------------------------------------------")        print(f"匹配到的JSON设备名称: {json_device_name}")        print(f"  主URL: {r['url']}")        print(f"  终止点A的URL: {r['termination_a']['url']}")        # 也可以打印设备自身的URL,如果需要        # print(f"  设备自身的URL: {r['termination_a']['device']['url']}")if not found_matches:    print("未找到任何匹配的设备。请检查设备名称是否完全一致。")

5. 运行结果示例

假设 test.json 和 test.txt 文件内容如本文档开头所示,运行上述代码将得到如下输出:

从文本文件中提取的设备名称: ['device-number1-2023-08 myname1', 'device-number3-2023-08 myname3', 'device-number8-2023-08 myname8']匹配到的设备及其URL信息:--------------------------------------------------匹配到的JSON设备名称: device-number1-2023-08 myname1  主URL: https://api.server.com/cables/100/  终止点A的URL: https://api.server.com/interfaces/250/--------------------------------------------------匹配到的JSON设备名称: device-number3-2023-08 myname3  主URL: https://api.server.com/cables/200/  终止点A的URL: https://api.server.com/interfaces/160/--------------------------------------------------匹配到的JSON设备名称: device-number8-2023-08 myname8  主URL: https://api.server.com/cables/300/  终止点A的URL: https://api.server.com/interfaces/260/

6. 注意事项与最佳实践

正则表达式的准确性: 正则表达式是核心。如果文本文件中设备名称的格式发生变化,需要相应地调整 device_name_pattern。不准确的正则表达式可能导致遗漏匹配或错误匹配。文件编码 在打开文件时,最好明确指定 encoding=’utf-8’,以避免因编码问题导致的读取错误。错误处理: 添加 try-except 块来处理 FileNotFoundError(文件不存在)和 json.JSONDecodeError(JSON格式错误),提高脚本的健壮性。性能优化: 将从文本文件中提取的设备名称存储在 set 中进行查找,对于大型数据集可以显著提高匹配效率,因为集合查找的时间复杂度平均为 O(1),而列表查找为 O(n)。JSON路径的深度: 示例中 termination_a.device.name 是一个相对深的路径。在实际应用中,确保你理解JSON的结构,并使用正确的键来访问所需的数据。完全匹配: 本教程采用的是字符串的完全匹配。如果需要模糊匹配,可以考虑使用更复杂的正则表达式或字符串相似度算法。

7. 总结

本教程详细阐述了如何使用Python高效地从JSON文件中提取与文本文件内容匹配的关联信息。通过结合 json 库进行数据解析和 re 库进行正则表达式匹配,我们能够灵活且精确地处理不同来源的数据。这种模式在日志分析、配置管理、数据同步等多种场景中都具有广泛的应用价值。掌握这种数据处理技巧,将大大提升您在Python编程中的数据处理能力。

以上就是Python:高效匹配文本与JSON数据并提取关联信息的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 16:04:24
下一篇 2025年12月14日 16:04:36

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 在 JavaScript 中移动 TodoList 中的“正在进行”任务如何解决?

    javascript 中使用 dom 更新 todolist 在您的问题中,您遇到了在使用 javascript 通过 dom 更新 todolist 时遇到困难的问题。具体来说,您无法将“正在进行”的任务移动到“已完成”部分。 问题原因 在您提供的 javascript 代码中,拼写错误导致“正在…

    2025年12月24日
    000
  • 在使用 JavaScript 实现的 TodoList 中,如何正确判断 Checkbox 点击事件,从而归类任务?

    使用 javascript 实现 todolist,点击 checkbox 后无法正确归类任务 问题描述:在使用 javascript 实现的 todolist 中,点击“正在进行”任务中的 checkbox,无法将任务自动归类到“已完成”任务列表。 原因分析:在提供的代码中,发现有一个单词拼写错误…

    2025年12月24日
    400
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 10款好看且实用的文字动画特效,让你的页面更吸引人!

    图片和文字是网页不可缺少的组成部分,图片运用得当可以让网页变得生动,但普通的文字不行。那么就可以给文字添加一些样式,实现一下好看的文字效果,让页面变得更交互,更吸引人。下面创想鸟就来给大家分享10款文字动画特效,好看且实用,快来收藏吧! 1、网页玻璃文字动画特效 模板简介:使用css3制作网页渐变底…

    2025年12月24日 好文分享
    000
  • tp5如何引入css文件

    tp5引入css文件的方法:1、将css文件放在public目录下的static文件里即可;2、在页面引入中写上“”语句即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 其实很简单,只需要将css,js,image文件放在这个目录下即可 页…

    2025年12月24日
    000
  • 聊聊CSS 与 JS 是如何阻塞 DOM 解析和渲染的

    本篇文章给大家介绍一下css和js阻塞 dom 解析和渲染的原理。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 hello~各位亲爱的看官老爷们大家好。估计大家都听过,尽量将CSS放头部,JS放底部,这样可以提高页面的性能。然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其…

    2025年12月24日
    200
  • js如何修改css样式

    js修改css样式的方法:1、使用【obj.className】来修改样式表的类名;2、使用【obj.style.cssTest】来修改嵌入式的css;3、使用【obj.className】来修改样式表的类名;4、使用更改外联的css。 本教程操作环境:windows7系统、css3版,DELL G…

    2025年12月24日
    000
  • 如何使用纯CSS、JS实现图片轮播效果

    本篇文章给大家详细介绍一下使用纯css、js实现图片轮播效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 .carousel {width: 648px;height: 400px;margin: 0 auto;text-align: center;position: a…

    2025年12月24日
    000
  • css怎么设置文件编码

    在css中,可以使用“@charset”规则来设置编码,语法格式“@charset “字符编码类型”;”。“@charset”规则可以指定样式表中使用的字符编码,它必须是样式表中的第一个元素,并且不能以任何字符开头。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • js如何修改css

    js修改css的方法:1、使用【obj.style.cssTest】来修改嵌入式的css;2、使用【bj.className】来修改样式表的类名;3、使用更改外联的css文件,从而改变元素的css。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js修改css的方法: 方法…

    2025年12月24日
    000
  • js如何改变css样式

    js改变css样式的方法:1、使用cssText方法;2、使用【setProperty()】方法;3、使用css属性对应的style属性。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js改变css样式的方法: 第一种:用cssText div.style.cssText…

    2025年12月24日
    000
  • 为什么css放上面js放下面

    css放上面js放下面的原因:1、在加载html生成DOM tree的时候,可以同时对DOM tree进行渲染,这样可以防止闪跳,白屏或者布局混乱;2、javascript加载后会立即执行,同时会阻塞后面的资源加载。 本文操作环境:Windows7系统、HTML5&&CSS3版,DE…

    2025年12月24日
    000
  • 推荐六款移动端 UI 框架

    作为一个前端人员来说,总结几款相对来说不错的用于移动端开发的UI框架是非常必要的,以下几种移动端UI框架就能基本满足工作中开发需要,根据项目需求,选用合适的框架搭建项目,更能容易提高开发效率。 一、MUI         最接近原生APP体验的高性能前端框架,追求性能体验,是我们开始启动MUI项目的…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信