揭秘Python正则匹配陷阱:为何你的模式总是匹配过长?

第一章:揭秘Python正则匹配陷阱:为何你的模式总是匹配过长?

在使用Python的`re`模块进行正则表达式匹配时,开发者常会遇到一个看似简单却极易忽略的问题:匹配结果比预期更长。这种现象通常源于对**贪婪匹配**机制的理解不足。

贪婪与非贪婪模式的本质区别

正则表达式默认采用贪婪模式,即尽可能多地匹配字符。例如,使用模式`.*`去匹配文本中的某一段内容时,它不会在第一次满足条件时停止,而是继续向后探索直到无法匹配为止。 考虑以下场景:从字符串中提取两个引号之间的内容。
# 示例文本
text = '他说:"你好,世界!" 然后离开。'

# 贪婪匹配(问题所在)
import re
pattern_greedy = r'"(.*)"'
result_greedy = re.findall(pattern_greedy, text)
print(result_greedy)  # 输出: ['你好,世界!" 然后离开。']
上述代码中,`.*`会一直匹配到最后一个引号,导致结果超出预期。

解决方案:启用非贪婪匹配

通过在量词后添加`?`,可将贪婪模式转换为非贪婪(惰性)模式。
# 非贪婪匹配(正确做法)
pattern_lazy = r'"(.*?)"'
result_lazy = re.findall(pattern_lazy, text)
print(result_lazy)  # 输出: ['你好,世界!']
此时,`.*?`会在遇到第一个闭合引号时立即停止匹配,从而获得精确结果。
  • 贪婪模式:`*`, `+`, `?`, `{n,}` —— 尽可能多匹配
  • 非贪婪模式:`*?`, `+?`, `??`, `{n,}?` —— 满足条件即停止
模式行为适用场景
.*匹配任意字符直到最后一个可能位置已知内容唯一且无重复边界符
.*?匹配任意字符直到第一个满足条件的位置提取成对分隔符间的内容(如引号、括号)
正确选择匹配模式是避免正则“过度捕获”的关键。

第二章:理解正则表达式的贪婪与非贪婪模式

2.1 贪婪匹配的默认行为及其原理

正则表达式在处理模式匹配时,默认采用贪婪匹配策略。这意味着引擎会尽可能多地匹配字符,直到无法满足条件为止。
匹配行为示例
以字符串 "abbb" 和正则表达式 a.*b 为例:
a.*b
该模式将匹配整个字符串 "abbb",而非最短的 "ab"。因为 .* 是贪婪量词,会一直扩展到字符串末尾,再逐步回溯以满足最后一个 b。
常见贪婪量词
  • *:匹配零个或多个,尽可能多
  • +:匹配一个或多个,尽可能多
  • {n,}:至少匹配 n 次,尽可能多
贪婪匹配依赖回溯机制完成最终匹配,理解其原理有助于避免性能陷阱和意外匹配结果。

2.2 非贪婪模式的语法与启用方式

在正则表达式中,非贪婪模式(也称懒惰模式)通过在量词后添加 ? 来启用。默认情况下,匹配是贪婪的,即尽可能多地匹配字符;而非贪婪模式则尽可能少地匹配。
语法形式
常见的量词如 *、+、{n,m} 可通过追加 ? 转换为非贪婪模式:
  • *?:零次或多次,但尽可能少
  • +?:一次或多次,但尽可能少
  • ??:零次或一次,但尽可能少
  • {n,m}?:n 到 m 次,但尽可能少
示例与分析
.*?example
该表达式会从文本起始位置开始匹配,一旦遇到第一个 "example" 就立即停止,而不是继续向后查找最后一个可能的匹配点。 例如,在字符串 "start example1 and example2" 中,使用 .*?example 将只匹配到 "start example1",体现了非贪婪特性在实际匹配中的优先级控制能力。

2.3 量词在贪婪控制中的关键作用

在正则表达式中,量词决定了匹配的重复次数,而其贪婪性直接影响匹配结果的长度与效率。默认情况下,量词如 *、+ 和 {n,} 是贪婪的,会尽可能多地匹配字符。
常见量词及其行为
  • *:匹配零次或多次,贪婪扩展
  • +?:匹配一次或多次,但使用问号变为非贪婪
  • {2,5}:匹配2到5次,贪婪获取最多可能
代码示例:贪婪与非贪婪对比
文本: "foo bar baz"
正则1: ".*"    → 匹配整个字符串 "foo bar baz"
正则2: ".*?"   → 仅匹配空字符串(非贪婪,最短满足)
上述示例中,.* 会一直扩展至文本末尾,而 .*? 在首次满足时即停止,体现了贪婪控制对匹配范围的决定性影响。

2.4 贪婪性如何导致意外的长匹配结果

正则表达式中的贪婪量词(如 *、+)会尽可能多地匹配字符,这在某些场景下可能导致超出预期的长匹配结果。
贪婪与非贪婪模式对比
以字符串 <div>内容1</div><div>内容2</div> 为例,使用正则表达式提取每个 div 标签内容:

贪婪模式:<div>(.*)</div>
非贪婪模式:<div>(.*?)</div>
上述贪婪模式会从第一个 <div> 一直匹配到最后一个 </div>,捕获整个区间,而非期望的单个标签块。
常见解决方案
  • 使用非贪婪量词 *? 或 +? 限制匹配长度
  • 通过字符类排除分隔符,如 [^<]* 匹配不含尖括号的内容
正确理解贪婪性行为可有效避免误匹配,提升正则表达式的精确度。

2.5 实际案例对比:贪婪 vs 非贪婪匹配效果

在正则表达式处理中,贪婪与非贪婪模式对结果影响显著。以提取HTML标签内容为例,展示两种模式的差异。
贪婪匹配示例
<div>.*</div>
该表达式会从第一个 <div> 一直匹配到最后一个 </div>,中间所有标签均被包含,导致跨标签捕获。
非贪婪匹配优化
<div>.*?</div>
添加问号后变为非贪婪模式,一旦遇到首个 </div> 即停止匹配,精确提取每个独立标签内容。
效果对比表格
模式正则表达式匹配行为
贪婪<div>.*</div>匹配最远结束符,可能包含多个完整标签
非贪婪<div>.*?</div>匹配最近结束符,精准提取单个标签

第三章:精准控制匹配长度的技术策略

3.1 使用非贪婪量词优化匹配精度

在正则表达式中,量词默认采用贪婪模式,尽可能多地匹配字符。这在某些场景下可能导致过度匹配,影响解析准确性。通过添加 ? 修饰符可将贪婪量词转为非贪婪模式,实现更精确的匹配控制。
非贪婪量词语法
常见的非贪婪量词包括:*?(零次或多次,最小匹配)、+?(一次或多次,最小匹配)、??(零次或一次,惰性匹配)以及 {n,m}?(指定范围内的最小匹配)。
".*?"
该表达式用于匹配引号内的最短字符串。例如,在文本 "first" "second" 中,贪婪模式 ".*" 会匹配整个 "first" "second",而非贪婪模式仅匹配 "first" 和 "second" 两个独立片段。
实际应用场景
  • HTML标签内容提取:避免跨标签匹配
  • 日志行解析:精准捕获特定字段
  • 配置文件读取:防止多段内容被合并

3.2 利用字符类和边界限定缩小范围

在正则表达式中,字符类和边界限定是提升匹配精度的关键手段。通过限定目标文本的字符集合与位置边界,可有效避免过度匹配。
常用字符类
  • [0-9]:匹配任意数字,等价于 \d
  • [a-z]:匹配小写字母
  • [A-Z]:匹配大写字母
  • [^abc]:匹配非 a、b、c 的字符
边界限定符的应用
\bword\b
该表达式中的 \b 表示单词边界,确保只匹配独立的 "word",而不匹配 "keyword" 中的子串。例如,在文本 "search word here" 中精准定位目标。
实际匹配场景对比
模式匹配内容说明
^\d{3}行首三个数字使用 ^ 限定起始位置
\w+@$行尾的单词加@使用 $ 锚定结尾

3.3 分组捕获与懒惰匹配的协同应用

在复杂文本解析中,分组捕获与懒惰匹配的结合能显著提升正则表达式的精确度。通过使用括号 () 进行分组捕获,可提取关键子串;而懒惰匹配 ? 能确保匹配尽可能少的字符,避免贪婪行为导致的越界捕获。
典型应用场景
例如,从 HTML 标签中提取属性值时:
<div class="(.*?)".*?>(.*?)</div>
该正则表达式使用两个捕获组:第一个匹配 class 属性值,第二个捕获标签内容。其中 .*? 为懒惰匹配,确保在遇到第一个引号或闭合标签时即停止。
匹配行为对比
模式输入结果
(.*)
1
2
捕获全部内容(贪婪)
(.*?)
1
2
仅捕获首个标签内容(懒惰)

第四章:常见场景下的贪婪匹配问题剖析

4.1 HTML标签提取中的过度匹配陷阱

在解析HTML文档时,开发者常使用正则表达式或DOM选择器提取特定标签内容。然而,**过度匹配**是常见问题,即模式过于宽泛,导致捕获了本不应包含的元素。
典型问题示例
例如,使用正则表达式 /<div.*?>(.*?)<\/div>/ 提取 div 内容时,可能跨层级错误匹配闭合标签。

<div class="content">
  <p>段落文本</p>
  <div class="nested">嵌套内容</div>
</div>
上述正则会因非贪婪匹配仍停留在最外层开始,错误截断嵌套结构,造成数据截取不完整。
解决方案建议
  • 优先使用成熟的HTML解析库(如BeautifulSoup、Cheerio)代替正则
  • 若必须用正则,应限定标签属性特征,避免通配符滥用
  • 结合上下文层级选择器,提升匹配精确度

4.2 日志行解析时的跨行匹配错误

在日志采集过程中,多行日志(如Java异常堆栈)常因分隔符配置不当被错误拆分为多个独立日志行,导致上下文丢失。
典型错误场景
当正则表达式仅匹配单行起始模式时,无法识别续行内容,造成跨行日志断裂。例如:
^\d{4}-\d{2}-\d{2}
该模式仅识别以日期开头的行,后续堆栈信息被误判为新日志。
解决方案:多行合并策略
使用支持continuation的解析器,通过反向匹配判断是否延续前文。如下配置可正确合并异常堆栈:
multiline.pattern: '^\s*at|Caused by:'
multiline.negate: false
multiline.match: after
此配置表示:若某行以“at”或“Caused by:”开头,则将其合并至前一行。参数说明: - pattern:匹配续行特征; - negate:false表示满足条件时合并; - match:after表示当前行追加到上一条日志。

4.3 字符串截取中因贪婪导致的数据污染

在正则表达式或字符串处理中,贪婪匹配常导致意外的数据截取。当模式未精确限定边界时,会过度捕获相邻内容,造成数据污染。
贪婪与非贪婪模式对比
  • 贪婪模式:匹配尽可能多的字符
  • 非贪婪模式:匹配尽可能少的字符,通常通过?修饰量词实现
代码示例
// 贪婪匹配:捕获从第一个引号到最后一个引号之间的所有内容
reGreedy := regexp.MustCompile(`"(.*)"`)
matchGreedy := reGreedy.FindStringSubmatch(`"name":"alice","age":"30"`)
// 结果:name":"alice","age":"30

// 非贪婪匹配:仅捕获第一个完整引号内的内容
reNonGreedy := regexp.MustCompile(`"(.*?)"`)
matchNonGreedy := reNonGreedy.FindStringSubmatch(`"name":"alice","age":"30"`)
// 结果:name
上述代码中,贪婪模式因未限制范围,错误地将多个字段合并,导致解析错误。使用非贪婪模式可精准提取目标字段,避免数据污染。

4.4 多层次嵌套结构中的匹配失控问题

在处理深度嵌套的数据结构时,正则表达式或递归解析器容易因边界条件缺失导致匹配失控,引发栈溢出或无限循环。
典型场景示例
以下 JSON 嵌套层级过深时,简单递归解析可能失控:
{
  "data": {
    "nested": {
      "value": 42,
      "deep": { "deep": { "deep": { ... } } }
    }
  }
}
未限制递归深度的解析函数会持续调用自身,超出调用栈限制。
解决方案对比
  • 设置最大嵌套层级阈值(如 100 层)
  • 采用迭代替代递归,结合显式栈管理
  • 预扫描结构深度,进行合法性校验
安全解析模式
使用带深度计数的解析器可有效控制风险:
func parseNode(node interface{}, depth int) error {
    if depth > maxDepth {
        return ErrExceededDepth
    }
    // 递归处理子节点,depth + 1
}
参数说明:maxDepth 为预设上限,depth 初始为 0,每层递增。

第五章:总结与最佳实践建议

持续集成中的配置优化
在 CI/CD 流水线中,合理配置构建缓存能显著提升部署效率。以下是一个 GitLab CI 中利用缓存加速 Go 构建的示例:

build:
  image: golang:1.21
  cache:
    paths:
      - /go/pkg/mod  # 缓存 Go 模块
  script:
    - go mod download
    - go build -o myapp .
安全凭证管理策略
避免在代码中硬编码密钥。使用环境变量结合 Secrets Manager 是更安全的选择。例如,在 Kubernetes 中通过 Secret 注入配置:

env:
  - name: DATABASE_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: password
  • 定期轮换访问密钥,建议周期不超过 90 天
  • 为服务账户分配最小必要权限,遵循最小权限原则
  • 启用操作审计日志,监控异常访问行为
性能监控的关键指标
建立可观测性体系时,应重点关注以下核心指标:
指标类型推荐阈值监控工具示例
API 延迟(P95)< 300msPrometheus + Grafana
错误率< 0.5%DataDog
容器内存使用率< 80%Kubernetes Metrics Server
流量治理流程图:
用户请求 → API 网关(认证)→ 限流中间件 → 微服务集群 → 数据库连接池 → 缓存层(Redis)
Python字符串trim三大方法:strip、lstrip、rstrip与正则的工程选型指南 字符串trim是数据输入净化的基础操作,本质是对不可信输入实施首尾空白清除的边界校验。其核心原理基于Unicode空白字符集(含\t\n\r\u3000\xa0等)的匹配与裁剪,技术价值在于保障后续逻辑运行于干净、可预测的数据之上。典型应用场景包括Web表单清洗、CSV/Excel字段处理、日志解析及API响应标准化。当需通用去空时首选strip();定向清除前缀(如'v'版本号)或后缀(如'\n')应使用lstrip()/rstrip();而面对零宽字符(\u200b)、BOM(\ufeff)或混合符号等 阅读详情

相关推荐

揭秘!100 个 Python 常用易错知识点的避坑指南

Python 作为一门广受欢迎且功能强大的编程语言,在实际使用过程中却常常让开发者们遭遇各种意想不到的 “陷阱”。本系列文章精心总结了 100 个 Python 中常见的易错知识点,内容覆盖从基础语法到高级特性,从变量数据类型到并发编程等多个方面。无论是初入编程世界的新手,还是经验丰富的开发者,都能从这些深入剖析与详细讲解中,清晰分辨易错点,掌握正确的编程方法,从而避开常见错误,提升 Python 编程技能与代码质量。定义单元素元组时,必须在元素后面加上逗号,否则会被解释为普通的括号表达式。收起。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1603

揭秘Python正则非贪婪模式:如何精准捕获最小匹配内容并避免常见陷阱

掌握Python正则表达式非贪婪匹配技巧,精准捕获最小内容块,避免过度匹配问题。适用于文本提取、日志解析等场景,通过?修饰符实现高效匹配,提升效率与准确性。实用方法总结,值得收藏。

Algorhythm的博客 764

基于Dify与DeepSeek构建中医智能问答工作流:从知识库到精准处方

本文详细介绍了如何利用Dify与DeepSeek构建中医智能问答工作流,实现从知识库构建到精准处方的全流程。通过模型编排和知识检索技术,系统能够结合中医辨证思维与AI推理能力,为基层医师、学生和爱好者提供结构化诊疗建议。文章重点分享了知识库选材、症状标准化处理、智能检索与辨证推理等核心环节的实战经验。

weixin_29062255的博客 251

【Python正则表达式非贪婪匹配】:揭秘高效文本提取的底层逻辑与实战技巧

掌握Python正则表达式非贪婪匹配,高效提取关键文本内容。适用于日志解析、网页抓取等场景,通过?修饰符实现最小化匹配,避免过度捕获。提升数据提取精度与效率,实用技巧值得收藏。

PixelIsle的博客 634

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充

本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。

weixin_29102619的博客 524

Imatest-Star模块(西门子星图)

星图分析指南:基于ISO12233标准的MTF测试方法,通过放射状射线和正弦灰度变化评估相机SFR性能。

weixin_64706696的博客 1566

揭秘Python海象运算符:如何用“:=”提升循环条件判断效率?

掌握Python 3.8海象运算符的循环条件技巧,提升代码简洁性与执行效率。通过“:=”在条件判断中直接赋值,避免重复计算,适用于读取文件、处理用户输入等场景。一行代码实现赋值与判断,让循环更高效,值得收藏。

ByteGlow的博客 574

SAP SD信贷管理实战:从配置到风险控制的完整指南(附后台路径)

本文详细解析了SAP SD信贷管理的完整配置流程与风险控制策略,涵盖信贷控制范围设置、风险分级机制及动态控制配置。通过实战案例和后台路径指引,帮助企业实现从客户信用评估到实时监控的全流程管理,有效降低坏账风险并优化资金安全。

3a9bq4r8t2y的博客 212

揭秘大模型训练数据陷阱:如何用Python与Shell实现精准清洗与格式转换

掌握大模型微调的数据清洗与格式转换(Python+Shell 自动化),有效解决训练数据杂乱、格式不统一等问题。适用于NLP任务预处理,通过脚本批量处理文本去噪、编码标准化与结构转换,提升数据质量与训练效率。方法简洁高效,值得收藏。

QuickDebug的博客 463

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4541

深度学习(五)迁移学习(实战:新数据预测+vgg16和聚类预测)

6、成功引入PCA数据降维技术,剔除了数据中的噪音信息、降低了模型复杂度、减少了模型训练时间,并最终提高了模型表现;gen=datagen.flow_from_directory(path,target_size=(224,224),batch_size=2,save_to_dir=dst_path,save_prefix='gen',save_format='jpg') # 生成图片大小224*224,bs产生多少组图像,存储路径和前缀。1、通过使用新数据,实现了模型的2次训练,达到了较好的预测效果;

weixin_37699342的博客 775

# Python JSON终极指南:参数精解/持久化实战/正则高阶应用

"当Python遇上JSON,数据从此有了穿越次元的能力——它既能翱翔于网络请求之间,又能沉睡于硬盘之中,更能在字符串的海洋中精准捕获目标。掌握json模块的奥义,就是握紧了打开数据流转之门的万能钥匙!"

2401_86120693的博客 321

AI 实战篇 |基于 AI开放平台实现 人脸识别对比 功能,超详细教程【附带源码】

本篇文章来学习一下怎样使用 Unity实现简单地人脸识别 功能。 关于人脸识别,我们可以选择很多平台的SDK接入Unity来实现人脸识别的功能。

努力前行,总会成为自己心中的那道光 5万+

正则表达式引擎源码解析:从NFA原理到性能优化实战

正则表达式是文本模式匹配的核心技术,广泛应用于数据验证、日志分析和信息提取等场景。其底层原理基于有限自动机理论,特别是非确定有限自动机(NFA)模型,通过状态转移和回溯算法实现模式识别。理解NFA与DFA的区别以及回溯机制,对于编写高效、健壮的正则表达式至关重要,能有效避免性能陷阱和匹配错误。在工程实践中,掌握编译期优化(如锚点分析和前缀提取)和运行期技巧(如使用非捕获分组和零宽断言),可以显著提升匹配效率。本文通过剖析正则表达式引擎源码,深入探讨了NFA的构建过程、回溯算法的实现细节,以及不同语言引擎的差

weixin_30522095的博客 408

第十六篇:Camx IFE 、OPE 各 port口功能定义

需要注意的是,类似 CSLTFEPortIdRawDump 是没有downscale功能的,所以如果遇到fov不正确的问题,可以排除下TFE这边的 output port是否被接到了 CSLTFEPortIdRawDump 上面来。我们知道Camx 的IFE 、OPE有不少的output port,各个port是有哪些功能的呢?老一点的框架平台,采用的TEF、OPE。

233

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

揭秘AI Agent成本陷阱:从OpenClaw部署到本地大模型实战优化

大语言模型(LLM)作为AI智能体的核心大脑,通过API调用实现自然语言理解与任务规划,其技术价值在于赋能自动化与智能化。然而,依赖云端闭源模型会带来高昂且不可控的API费用,成为成本黑洞。在AI Agent的实际应用场景中,例如自动化数据处理、智能客服与报告生成,成本控制至关重要。本文以OpenClaw项目为例,深入剖析其架构中隐含的**云算力**消耗风险,并重点阐述通过部署**本地开源模型**(如Llama、Qwen)替代云端API,结合Ollama等工具进行完全本地化或混合部署,从而实现从“云成本中心

weixin_30314813的博客 358

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

揭秘Python datetime转换难题:3步轻松搞定字符串解析

轻松解决python字符串转datetime对象格式难题,3步精准解析常见时间格式。适用于日志处理、数据清洗等场景,利用strptime灵活匹配,高效可靠。方法简单实用,值得收藏。

CompiShoal的博客 573

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【PythonAI语法纠错技巧】:揭秘9大高频错误及智能修复方案

掌握PythonAI语法纠错技巧,轻松解决编码中的常见错误。涵盖变量命名、缩进、括号匹配等9大高频问题,结合AI工具智能诊断与修复,提升开发效率。适用于Python初学者与AI项目实践,精准定位bug,一键优化代码质量。值得收藏的实用指南,点击了解详情。

InstrGap的博客 1041

Python 中的垃圾回收机制揭秘

基于Kafka+ElasticSearch+MongoDB+Redis+XXL-Job日志分析系统(学习)配置即权限:从传统开源 RBAC 框架到 SPARK 的六层数据护盾,告别改权限就要改代码的魔咒。c++&MFC 用boost.asio库写的串口功能,包含发送、异步接收、打开、重连、关闭功能。Windows下NVM保姆级指南:安装、切换版本、指定路径+淘宝镜像配置,一次搞定!第2集:技术选型的智慧:Flask vs FastAPI,GLM-4 vs GPT。

slngX_vixq7的博客 348

3行代码识别声音性别:gender_cls_svm_ecapa_voxceleb语音性别分类模型完全介绍

**gender_cls_svm_ecapa_voxceleb** 是一个开箱即用的**语音性别分类模型**:只需 3 行代码,输入一段音频,它就能自动判断说话人是 "male" 还是 "female"。该项目基于 SpeechBrain 的 ECAPA-TDNN 说话人嵌入模型 + 支持向量机(SVM)分类器,在 VoxCeleb2 测试集上达到了 **98.9% 的准确率**,适合新手快速实现

gitblog_00555的博客 191

程序员的逃生指南:转义字符深度解密手册

转义字符就像编程世界的标点符号,用错了轻则报错,重则引发安全漏洞。在正则表达式里,反斜杠数量=语言转义次数+正则转义次数HTML实体转义要优先于JS执行处理文件路径永远使用原始字符串模式JSON里的斜杠转义不是bug是feature(终极忠告)当你看到字符时,永远保持敬畏之心——它可能正在酝酿下一个深夜debug的惨案!

laowangpython的博客 1019

GPT-5.5成本陷阱揭秘:上下文溢价与输出膨胀如何推高真实调用成本

大语言模型API调用成本并非简单由token单价决定,其本质是推理资源消耗的综合体现。GPT-5.5等长上下文模型在实际运行中,受上下文长度非线性增长、输出长度不可控性、高频调用冷启动开销及中间件服务层叠加等多重因素影响,导致标称低价与真实单任务成本严重偏离。尤其当启用128K上下文或处理法律文书、多轮对话等高膨胀率任务时,输出token实际消耗可超预设值67%以上,而平台常将隐性成本包装为‘智能调度费’‘上下文保活费’等模糊条目。本文基于27个第三方平台实测数据,揭示GPT-5.5成本结构错位的核心机制,

weixin_30443747的博客 480

PDF转Word失败原因揭秘:四类PDF体质与精准转换方案

PDF转Word不是简单的格式转换,而是涉及文档语义理解、布局还原与字体映射的复合技术问题。其核心在于PDF文件的底层结构差异:扫描件依赖OCR识别精度,原生文本PDF考验字体嵌入与数学公式解析能力,表格密集型PDF需视觉逻辑重建,加密PDF则受权限机制限制。真正影响转换质量的并非工具品牌,而是对PDF‘基因型’的准确识别与匹配——例如LaTeX导出PDF中的OMath对象、扫描件中的手写批注干扰、财务报表里的无线表格结构等。本文基于27款工具实测数据,从原理层揭示转换失败根源,并提供面向学生、科研人员与开

weixin_33875564的博客 423

Python求职自动化:模拟真实用户行为的精准岗位搜索方案

求职自动化不是简单的网页抓取,而是对招聘平台人机交互逻辑的深度建模。其核心在于理解HTTP行为指纹、页面交互节律与JD语义意图三层反爬机制,并通过Playwright实现类人操作模拟,结合LangChain完成非结构化职位描述的精准解析。该技术路径聚焦‘有效转化率’而非‘请求吞吐量’,适用于应届生海投优化、在职工程师静默换岗及Tech Lead市场调研等真实场景,本质是将Python从数据采集工具升级为具备判断力的数字求职助手。

weixin_30430169的博客 351

Python KeyError实战指南:从字典取值到生产级容错

KeyError是Python中因访问不存在字典键而触发的核心异常,本质反映数据契约的断裂而非语法错误。其处理逻辑需兼顾性能(如get()零开销 vs try/except三倍耗时)、可读性与调试成本。在电商订单同步、API响应解析、日志统计等高频场景中,合理选用dict.get()、defaultdict、safe_get_nested等方案,可实现柔性降级、自动初始化与精准断点定位。本文聚焦真实项目中的嵌套字典安全取值、配置动态加载、契约校验与大规模数据清洗,揭示KeyError背后的数据治理本质。

weixin_34314962的博客 396

Kami 生产级文档构建手册:从 HTML / Markdown / Python 到 PDF、PPTX 与 DOCX 的完整渲染、验证与排障指南

本文是 Kami 项目的工程运行手册(Engineering Runbook),系统讲解如何从 HTML、Python 与 Markdown 三类源材料产出 PDF、PPTX、浏览器演示稿与 DOCX 四类交付物。内容以 [production.md](https://link.gitcode.com/i/a68a7332b17eaa69ed5355c4a4630260) 为骨架,覆盖每条渲染路径

gitblog_00756的博客 163
上一篇: 【Python多进程池性能优化】:揭秘imap_unordered的高效并发秘密
下一篇: 揭秘PyQt5中QTableWidget单元格合并难题:5步搞定复杂表头设计
BytePerch
博客等级 码龄1年 164粉丝 1971原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值