Python中基于文本匹配JSON数据并提取关联URL信息

心靈之曲
发布: 2025-10-09 10:50:01
原创
784人浏览过

Python中基于文本匹配JSON数据并提取关联URL信息

本教程详细介绍了如何使用Python处理JSON和文本文件,通过正则表达式从文本中提取特定模式的设备名称,并以此名称作为键,在JSON结构化数据中查找匹配项,最终提取并展示关联的URL信息。文章涵盖了文件读写、JSON解析、正则表达式应用及数据遍历等核心技术,旨在提供一个高效、实用的数据整合解决方案。

1. 概述

在日常数据处理中,我们经常会遇到需要从非结构化文本中提取关键信息,并将其与结构化数据(如json)进行关联匹配的场景。本教程将以一个具体示例,演示如何利用pythonjson模块进行json数据解析,re模块进行正则表达式匹配,从而实现从纯文本文件中识别设备名称,并在一个包含设备详细信息的json文件中找到对应的记录,最终提取出所需的url字段。

2. 准备工作

在开始编写代码之前,我们需要准备两个示例文件:一个JSON文件(test.json)和一个纯文本文件(test.txt)。

2.1 JSON文件 (test.json)

这个文件包含了多个设备的信息,每个设备都有一个唯一的名称和多个关联的URL。

{
  "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"
        }
      }
    }
  ]
}
登录后复制

2.2 文本文件 (test.txt)

这个文件包含了一些描述性文本,其中嵌入了我们想要匹配的设备名称。

this is device-number1-2023-08 myname1 and it is good.
this is device-number8-2023-08 myname8 and it is.
this is device-number3-2023-08 myname3 and it is not good.
this is an unmatched-device-name and it is irrelevant.
登录后复制

3. 实现步骤与代码

我们将通过以下步骤实现目标:

Remove.bg
Remove.bg

AI在线抠图软件,图片去除背景

Remove.bg 174
查看详情 Remove.bg

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

  1. 读取并解析JSON文件。
  2. 读取文本文件内容。
  3. 使用正则表达式从文本内容中提取所有设备名称。
  4. 遍历JSON数据,将JSON中的设备名称与从文本中提取的名称进行比对。
  5. 如果名称匹配,则打印出JSON中对应的URL信息。

3.1 示例代码

import json
import re

def find_and_extract_urls(json_filepath, text_filepath):
    """
    从文本文件中提取设备名称,并在JSON文件中查找匹配的设备,
    然后打印出关联的URL信息。

    Args:
        json_filepath (str): JSON文件的路径。
        text_filepath (str): 文本文件的路径。
    """
    # 1. 读取并解析JSON文件
    try:
        with open(json_filepath, 'r', encoding='utf-8') as json_file:
            json_data = json.load(json_file)
    except FileNotFoundError:
        print(f"错误: 未找到JSON文件 '{json_filepath}'")
        return
    except json.JSONDecodeError:
        print(f"错误: JSON文件 '{json_filepath}' 格式不正确")
        return

    # 2. 读取文本文件内容
    try:
        with open(text_filepath, 'r', encoding='utf-8') as text_file:
            text_content = text_file.read()
    except FileNotFoundError:
        print(f"错误: 未找到文本文件 '{text_filepath}'")
        return

    # 3. 使用正则表达式从文本内容中提取所有设备名称
    # 正则表达式解释:
    # (device-\w+-\d+-\d+ \w+): 捕获组,匹配 'device-' 开头,
    # 接着是任意单词字符 (\w+),然后是两个数字组 (\d+),
    # 最后是一个空格和任意单词字符 (\w+)。
    # 示例匹配: "device-number1-2023-08 myname1"
    txt_device_names = re.findall(r"(device-\w+-\d+-\d+ \w+)", text_content)

    # 将提取到的名称转换为集合,以便O(1)时间复杂度进行查找,提高效率
    txt_device_names_set = set(txt_device_names)

    print(f"从文本文件 '{text_filepath}' 中提取到的设备名称: {txt_device_names_set}\n")

    # 4. 遍历JSON数据,查找匹配项并提取URL
    found_matches = False
    for item in json_data.get("results", []): # 使用.get()处理'results'键可能不存在的情况
        device_info = item.get("termination_a", {}).get("device", {})
        json_device_name = device_info.get("name")

        if json_device_name and json_device_name in txt_device_names_set:
            found_matches = True
            print(f"匹配成功!设备名称 --> {json_device_name}")
            print(f"  根URL: {item.get('url', 'N/A')}")
            print(f"  termination_a URL: {item.get('termination_a', {}).get('url', 'N/A')}")
            # 如果需要,还可以打印其他URL,例如 termination_a device URL
            # print(f"  termination_a device URL: {device_info.get('url', 'N/A')}")
            print("-" * 30)

    if not found_matches:
        print("未找到任何匹配的设备名称。")

# 调用函数执行匹配和提取
if __name__ == "__main__":
    json_file_path = 'test.json'
    text_file_path = 'test.txt'
    find_and_extract_urls(json_file_path, text_file_path)
登录后复制

3.2 代码解释

  1. 导入模块: json 用于处理JSON数据,re 用于正则表达式操作。
  2. 文件读取:
    • 使用 with open(...) 语句确保文件在操作完成后被正确关闭,即使发生错误。
    • json.load(json_file) 将JSON文件内容解析为Python字典。
    • text_file.read() 读取整个文本文件的内容到一个字符串。
    • 增加了 try-except 块来处理 FileNotFoundError 和 json.JSONDecodeError,增强程序的健壮性。
  3. 正则表达式匹配:
    • re.findall(r"(device-\w+-\d+-\d+ \w+)", text_content) 是核心。
      • r"..." 表示这是一个原始字符串,避免反斜杠的转义问题。
      • (device-\w+-\d+-\d+ \w+) 是正则表达式模式,用于捕获符合特定格式的设备名称。
        • device-: 字面匹配 "device-"。
        • \w+: 匹配一个或多个字母、数字或下划线。
        • \d+: 匹配一个或多个数字。
        • ` `: 匹配一个空格。
        • (): 捕获组,表示我们想要提取括号内的内容。
    • txt_device_names 将是一个包含所有匹配到的设备名称的列表。
    • 将 txt_device_names 转换为 set (txt_device_names_set) 是一个重要的优化,它使得后续在循环中检查 json_device_name in txt_device_names_set 的操作具有平均 O(1) 的时间复杂度,而如果使用列表则为 O(n),在大数据量时性能差异显著。
  4. 数据遍历与匹配:
    • 代码遍历 json_data["results"] 列表中的每一个字典(代表一个设备)。
    • 通过 item.get("termination_a", {}).get("device", {}).get("name") 安全地访问嵌套字典中的设备名称。使用 .get() 方法可以在键不存在时返回默认值(这里是空字典或 None),避免 KeyError。
    • if json_device_name and json_device_name in txt_device_names_set: 判断从JSON中获取的设备名称是否存在于从文本中提取的名称集合中。
    • 如果匹配成功,则打印出根URL (item['url']) 和 termination_a 下的URL (item['termination_a']['url'])。同样,使用 .get() 方法安全地访问这些URL。

4. 运行结果

执行上述Python脚本,你将看到如下输出:

从文本文件 'test.txt' 中提取到的设备名称: {'device-number8-2023-08 myname8', 'device-number1-2023-08 myname1', 'device-number3-2023-08 myname3'}

匹配成功!设备名称 --> device-number1-2023-08 myname1
  根URL: https://api.server.com/cables/100/
  termination_a URL: https://api.server.com/interfaces/250/
------------------------------
匹配成功!设备名称 --> device-number3-2023-08 myname3
  根URL: https://api.server.com/cables/200/
  termination_a URL: https://api.server.com/interfaces/160/
------------------------------
匹配成功!设备名称 --> device-number8-2023-08 myname8
  根URL: https://api.server.com/cables/300/
  termination_a URL: https://api.server.com/interfaces/260/
------------------------------
登录后复制

5. 注意事项与扩展

  • 正则表达式的准确性: 正则表达式是此解决方案的关键。确保你的模式能够准确捕获目标字符串,同时避免误匹配。如果设备名称的格式发生变化,你需要相应地调整正则表达式。
  • 性能优化: 对于非常大的文本文件,逐行读取并处理可能比一次性读取整个文件更节省内存。对于非常大的JSON文件,考虑使用流式解析(如 ijson 库)而不是一次性加载到内存。
  • 错误处理: 在实际应用中,应增加更完善的错误处理机制,例如处理文件不存在、JSON格式错误、数据结构不符合预期等情况。本教程已包含基本的 try-except 块。
  • 数据结构灵活性: 如果JSON数据的结构可能变化,访问嵌套字段时应更多地使用 dict.get() 方法,并提供默认值,以防止 KeyError。
  • 输出格式: 根据实际需求调整输出的格式和内容。你可以将提取到的信息存储到新的数据结构中,或者写入到新的文件里。

6. 总结

本教程展示了如何结合Python的文件I/O、JSON解析和正则表达式,高效地从非结构化文本中提取信息,并与结构化数据进行匹配和关联。这种方法在数据清洗、数据集成和自动化报告等多种场景下都非常实用。通过理解并灵活运用这些技术,你可以构建出强大的数据处理脚本,以

以上就是Python中基于文本匹配JSON数据并提取关联URL信息的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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