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

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

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载

立即学习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解析和正则表达式,高效地从非结构化文本中提取信息,并与结构化数据进行匹配和关联。这种方法在数据清洗、数据集成和自动化报告等多种场景下都非常实用。通过理解并灵活运用这些技术,你可以构建出强大的数据处理脚本,以

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

766

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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