如何正确使用正则表达式从 Linux RT 补丁页面提取所有补丁文件名

梦瑶酱_4560

梦瑶酱_4560

2026-11-10

411人浏览

原创

如何正确使用正则表达式从 Linux RT 补丁页面提取所有补丁文件名

本文详解为何原始代码中 for 循环未能将全部版本的补丁文件名(如 patch-5.16.2-rt19.patch.gz)追加到列表,核心问题在于正则表达式过于严格且未覆盖真实文件命名变体;通过优化正则模式、增强容错性并添加异常处理,可完整采集 2.6 至 6.9+ 所有有效补丁名。

本文详解为何原始代码中 `for` 循环未能将全部版本的补丁文件名(如 `patch-5.16.2-rt19.patch.gz`)追加到列表,核心问题在于正则表达式过于严格且未覆盖真实文件命名变体;通过优化正则模式、增强容错性并添加异常处理,可完整采集 2.6 至 6.9+ 所有有效补丁名。

在解析 Linux 实时内核(RT Patch)项目页面时,一个常见目标是批量提取各版本对应的补丁包文件名(例如 patch-5.15.37-rt20.patch.xz、patches-6.1.25-rt18.tar.gz 等)。但若正则表达式设计不当,即使 for 循环逻辑正确、HTTP 请求成功、遍历无遗漏,最终结果仍会严重缺失——正如原始代码所示:看似“只返回了早期版本(如 2.6)”,实则是匹配失败导致静默跳过后续所有版本。

根本原因在于原始正则 r'patch-.*?\.tar\.xz' 过度限定:

  • ✅ 仅匹配以 patch- 开头、以 .tar.xz 结尾的字符串;
  • ❌ 完全忽略真实存在的多种格式:.patch.gz、.patch.xz、patches-*.tar.gz、patches-*.tar.xz 等;
  • ❌ 且 .*? 在遇到首个 . 即停止,无法兼容 -rtXX 后缀中的连字符与数字组合。

因此,当程序访问 https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.16/sha256sums.asc 时,4 个真实补丁名全部不满足该模式,re.findall() 返回空列表,patches_full_versions.append() 实际从未执行——并非数组被重置或循环中断,而是每轮迭代都“成功地什么也没加”。

以下是修复后的健壮实现:

import re
import requests

patches_versions = []
patches_full_versions = []

RT_PATCHES_BASE_URL = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/"

# 清理 HTML 标签(用于解析索引页)
cleaner = re.compile(r"<.>")

# 步骤1:提取所有可用版本目录名(如 "5.16", "6.1")
try:
    patches_page_content = requests.get(RT_PATCHES_BASE_URL, timeout=10)
    patches_page_content.raise_for_status()
    stripped_content = re.sub(cleaner, "", patches_page_content.text)
    for line in stripped_content.splitlines():
        # 使用更可靠的判断:行中含数字即视为潜在版本行
        if re.search(r"\d", line):
            parts = line.strip().split("/")
            if parts and parts[0].strip():  # 避免空字符串
                patches_versions.append(parts[0].strip())
except Exception as e:
    print(f"[ERROR] Failed to fetch versions list: {e}")
    exit(1)

# 步骤2:为每个版本抓取 sha256sums.asc 并提取补丁文件名
patch_name_pattern = re.compile(r"(?:patch|patches)[\w\-\.]+(?:\.patch|\.tar)\.(?:gz|xz)")  # 支持主流扩展名
for version in patches_versions:
    url = f"{RT_PATCHES_BASE_URL}{version}/sha256sums.asc"
    try:
        resp = requests.get(url, timeout=10)
        resp.raise_for_status()
        # 提取所有匹配的补丁名(去重可选)
        matches = re.findall(patch_name_pattern, resp.text)
        patches_full_versions.extend(matches)  # 推荐用 extend 替代多次 append
        print(f"[INFO] Version {version}: found {len(matches)} patches")
    except requests.exceptions.RequestException as e:
        print(f"[WARN] Skipping {url} — request failed: {e}")
    except Exception as e:
        print(f"[WARN] Unexpected error parsing {url}: {e}")

print(f"\n✅ Total collected patches: {len(patches_full_versions)}")
print("First 5 examples:", patches_full_versions[:5])</.>

关键改进说明:

Linuxdo Application
Linuxdo Application

为 Linux.do 注册撰写高通过率、去 AI 化的中文小作文。进行自适应调查以了解申请人的真实背景,...

下载
  • 正则升级:r"(?:patch|patches)[\w\-\.]+(?:\.patch|\.tar)\.(?:gz|xz)"

    • (?:patch|patches) 非捕获分组,覆盖两种前缀;
    • [\w\-\.]+ 宽松匹配版本号、-rtX、点号和连字符;
    • (?:\.patch|\.tar) 明确支持 .patch 和 .tar 两类主后缀;
    • \.(?:gz|xz) 精确限定压缩格式,避免误匹配其他扩展名(如 .asc, .sig)。
  • 健壮性增强:

    • 全局 try/except 包裹 HTTP 请求,防止单个失败中断整个流程;
    • timeout=10 避免请求挂起;
    • 使用 extend() 批量添加,比循环 append() 更高效;
    • 添加日志输出,便于定位哪一版缺失或失败。
  • 注意事项:

    • sha256sums.asc 文件内容为纯文本哈希列表(如 a1b2c3... patch-6.6.12-rt7.patch.xz),无需 HTML 解析,原代码中对它的正则直接作用于 resp.text 是正确的;
    • 若需进一步去重或按版本分组,可在收集后用 collections.defaultdict(list) 处理;
    • 生产环境建议添加 User-Agent 头(headers={"User-Agent": "Mozilla/5.0..."}),避免部分 CDN 拒绝爬虫请求。

运行修复后代码,你将看到 patches_full_versions 真实包含从 2.6 到最新 6.x 的全部补丁文件名,验证方式:检查输出总数是否与各 sha256sums.asc 页面手动统计一致,并确认示例中包含 patch-5.16.2-rt19.patch.gz 等此前被遗漏的格式。

相关专题

更多
js正则表达式
js正则表达式

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

2023.06.20

4916

8

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

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

2023.07.05

3381

4

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

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

2023.07.05

9422

9

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

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

2023.08.11

832

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

520

5

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

693

12

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

2023.11.17

406

3

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.06

739

7

php正则表达式有哪些
php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、&a

2024.02.23

312

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习