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

花韻仙語
发布: 2025-10-09 10:25:06
原创
617人浏览过

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免费学习笔记(深入)”;

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

3. 实现步骤与示例代码

3.1 导入必要的库

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

import json
import 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。我们可以设计一个正则表达式来捕获这种模式。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online

正则表达式 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 json
import 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 = False
for 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数据并提取关联信息的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号