
在数据处理的日常工作中,我们经常会遇到需要从不同来源、不同格式的数据中进行信息匹配和提取的需求。例如,可能需要根据一个纯文本文件中记录的名称,去一个复杂的json结构中查找对应的详细信息。本教程将以一个具体的场景为例,演示如何使用python结合json模块和re(正则表达式)模块,高效地完成这一任务。
为了更好地演示,我们首先准备两份示例数据:一份JSON文件(test.json)和一份纯文本文件(test.txt)。
我们的JSON文件包含一个results列表,其中每个元素代表一个设备连接信息。每个连接包含一个主url和termination_a对象,termination_a内部又嵌套了device信息,其中device对象含有name字段,这是我们进行匹配的关键。
{
"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 myname"
}
}
},
{
"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-number1-2023-08 myname1"
}
}
},
{
"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 myname"
}
}
}
]
}文本文件包含多行描述性文字,每行中都嵌入了一个设备名称。我们需要从这些非结构化的句子中提取出设备名称。
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.
我们将通过以下几个步骤来实现数据匹配和提取:
立即学习“Python免费学习笔记(深入)”;
以下是实现上述功能的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 文件格式不正确。")
exit()
try:
with open("test.txt", "r", encoding="utf-8") as text_file:
text_content = text_file.read()
except FileNotFoundError:
print("错误:test.txt 文件未找到。")
exit()
# 2. 从文本文件中提取设备名称
# 定义正则表达式模式来匹配设备名称,例如 "device-number1-2023-08 myname1"
# 模式解释:
# device-: 匹配字面字符串 "device-"
# \w+: 匹配一个或多个字母、数字或下划线 (例如 "number1", "2023", "08", "myname")
# \d+: 匹配一个或多个数字
# \s: 匹配一个空格
# ():捕获组,re.findall 将返回匹配到的组内容
device_name_pattern = r"(device-\w+-\d+-\d+\s\w+)"
txt_device_names = re.findall(device_name_pattern, text_content)
print(f"从文本文件中提取到的设备名称: {txt_device_names}\n")
# 3. 在JSON数据中查找匹配项并提取信息
# 4. 提取并输出关联信息
if "results" in json_data and isinstance(json_data["results"], list):
found_matches = False
for item in json_data["results"]:
try:
json_device_name = item["termination_a"]["device"]["name"]
# 检查JSON中的设备名称是否在文本文件中提取到的名称列表中
if json_device_name in txt_device_names:
found_matches = True
print(f"找到匹配设备: {json_device_name}")
print(f" 主URL: {item['url']}")
print(f" 终止A URL: {item['termination_a']['url']}")
print(f" 终止A设备URL: {item['termination_a']['device']['url']}\n")
except KeyError as e:
print(f"警告:JSON数据结构不完整,缺少键 '{e}'。跳过此项。")
continue
if not found_matches:
print("未找到任何匹配的设备名称。")
else:
print("错误:JSON数据结构不符合预期,缺少 'results' 列表。")
导入模块:
加载数据:
从文本文件中提取设备名称:
在JSON数据中查找匹配项并提取信息:
本教程展示了如何利用Python的json模块和re模块,有效地从不同格式的数据源(JSON和纯文本)中进行数据匹配和信息提取。通过精确的正则表达式提取关键信息,并结合结构化数据的遍历,我们可以实现复杂的数据关联任务。掌握这些技术对于处理异构数据源和构建数据处理管道至关重要。
以上就是Python数据匹配教程:利用正则表达式关联JSON与文本文件信息的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号