0

0

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

心靈之曲

心靈之曲

发布时间:2025-10-09 10:50:01

|

797人浏览过

|

来源于php中文网

原创

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. 实现步骤与代码

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

STORYD
STORYD

帮你写出让领导满意的精美文稿

下载

立即学习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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

716

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

626

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1236

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

699

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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