Python正则表达式\W+和\W*匹配过程的深入分析

TXT文档自动化目录生成:Python正则表达式实战与多方案解析 在数据处理与文档管理领域,纯文本(TXT)因其通用性和轻量级特性,常被用于存储日志、电子书、配置信息等非结构化数据。然而,面对海量文本内容时,缺乏快速导航结构会严重影响检索与阅读效率。为此,通过自动化脚本为TXT文档注入结构化目录成为一种关键技术手段,其核心原理是利用正则表达式(Regex)模式匹配,自动识别文档中的标题行并生成带行号索引的目录。这一技术不仅显著提升了大规模文本文件的浏览体验,更在数据处理、电子书整理、日志分析等场景中展现出巨大价值。例如,结合“txt转bat”等批处理操作,可实现文件夹内批 阅读详情

在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致:

>>> re.split('\W*','Hello,world')
['', 'H', 'e', 'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd', '']

而老猿期望的是[’’, ‘Hello’, ‘’, ‘world’, ‘’],结果差异很大。
我们再看使用组模式匹配的结果:

>>> re.split('(\W*)','Hello,world')
['', '', 'H', '', 'e', '', 'l', '', 'l', '', 'o', ',', '', '', 'w', '', 'o', '', 'r', '', 'l', '', 'd', '', '']

也不是老猿期望的:[’’,‘Hello’, ‘,’, ‘world’, ‘’]。
将上述匹配模式中的\W*改成\W+,来看看效果:

>>> re.split('\W+','Hello,world')
['Hello', 'world']
>>> re.split('(\W+)','Hello,world')
['Hello', ',', 'world']
>>>

这个效果与老猿预想一致。在老猿预想的里面,使用“\W*”和“\W+”的区别应该就是在搜索文本头和尾的处理上二者有区别,“\W*”应该比“\W+”只多头和尾匹配的空字符串,毕竟二者都是贪婪模式,只是“\W*允许0次重复”。为什么执行结果却大相径庭呢?
经过仔细思考,老猿认为正则的匹配过程有关,在贪婪模式下,老猿理解上述正则表达式的匹配基本处理方法如下:

  1. 所有匹配过程都是从搜索文本当前匹配到的位置(为了后续方便称为当前匹配位置)开始的,首次匹配就从搜索文本位置0开始,其后真正匹配过程每匹配一个字符匹配位置加一(前视断言、后视断言等不消耗搜索文本的方法除外);
  2. 每次匹配时,都是从搜索文本当前匹配位置开始以类似切片的机制开始匹配:
    1)切片的开始位置为当前位置,切片的结束位置从当前位置开始逐一增加(假设当前位置为n,则第一次切片类似n:n,也就是空字符串);
    2)每次切片都会验证是否切片后的内容能否匹配当前模式,如果能匹配,切片结束位置加一,按此顺序处理,直到切片不能匹配为止;
    3)如果当前切片不能匹配,则匹配的搜索文本子串就是前一个切片(不妨称为匹配切片),如果前一个切片的起止位置相同则为空字符串,如果起始位置大于结束位置则没有匹配到,否则就是正常匹配;
    4)匹配到空串或正常子串都认为匹配成功,当前匹配位置=匹配切片结束位置+1。

这样我们回头来看使用“\W*”和“\W+”来匹配单词“Hello”的过程,由于每个字符当前位置的0长切片都为空字符串,他们满足“\W*”匹配要求,而下个长度为1的切片是字母字符,不能满足匹配的要求,因此会认为单词的每个字母之间都会被空字符串分割,如果不接受这样的结果,使用”\W+”来匹配就可以。

关于阅读本文所需要使用的基础知识请参考:
1、关于“\W*”和“\W+”的含义请参考《第11.15节 Python正则表达式转义符定义的特殊序列》;
2、关于切片请参考《第3章 Python的数据类型 第3.1节 功能强大的 Python序列概述》;
3、关于正则表达式贪婪模式请参考:《第11.9节 Python正则表达式的贪婪模式和非贪婪模式》及《转:正则表达式之 贪婪与非贪婪模式详解》;
4、关于re.split请参考《第11.22节Python 中re模块的split函数》。

老猿Python,跟老猿学Python!
博客地址:https://blog.youkuaiyun.com/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

【Python 语法】Python 正则表达式(regular expressions, regex) Python 正则表达式(regular expressions, regex) 阅读详情

相关推荐

正则表达式高效学习指南PDF合集

为了提高书写效率,正则提供了若干预定义字符类,它们是对常用字符集合的简写形式:简写等价形式含义\d[0-9]数字字符\D[^0-9]非数字字符\s空白字符\S非空白字符\w单词字符(字母、数字、下划线)\W非单词字符然而,这些简写的语义在不同平台和模式下存在显著差异,尤其是在启用 Unicode 模式时。

weixin_42605397的博客 1051

正则表达式\W+、(\W+)、(\W)+、[\W]+、[\W+]分割时候的区别

如图,示例和打印结果, \W+:匹配一个或多个非字母进行切割,匹配到的非字母不缓存; (\W+):匹配一个或多个非字母进行切割,匹配到的非字母全部缓存; (\W)+:匹配一个或多个非字母进行切割,匹配到的非字母缓存最后一位; [\W]+:匹配一个或多个非字母进行切割,匹配到的非字母不缓存;(跟\W+一样) [\W+]:匹配一个非字母进行切割,匹配到的非字母不缓存(加号没用)。 ...

weixin_44356698的博客 2万+

Python 使用Pygame库实现足球游戏:创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理

本文将介绍如何使用Python和Pygame库创建一个简单的足球游戏。我们将搭建一个基本的游戏环境,创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理。这个简单的足球游戏展示了Pygame的一些基本功能。虽然这是一个简单的游戏,但它包含了创建游戏循环、用户输入处理、物理模拟、碰撞检测等重要概念。

程序熊的博客 743

正则表达式总结

1.正则表达式简介: 正则表达式是一些具有特殊含义的字符组成的字符串,多用于查找替换符合规则的字符串。 2.元字符: 元字符:有特殊含义的字符 常见的元字符如下: 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意思 $ 匹配字符串的结束 示例: (1)\d\

m0_57026595的博客 4488

生成式引擎优化(GEO)全景指南:技术架构、实施策略与未来趋势

生成式引擎优化(GEO)全景指南摘要 GEO(生成式引擎优化)是针对AI生成内容(如ChatGPT、文心一言等)的优化策略,通过结构化数据、权威建设与语义优化提升企业内容在AI答案中的引用优先级,实现“无点击曝光”。其核心价值在于从流量竞争转向信任构建,突破传统SEO局限。技术架构依托RAG(检索增强生成)、向量数据库及反馈学习机制,动态优化内容生成与引用逻辑。实施策略包括:部署结构化数据(如JSON-LD)、维护动态知识图谱、适配多模态内容(3D/VR)、联合权威机构发布白皮书。行业案例显示,美妆、智能家

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1451

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

Python 正则表达式

re模块: compile () #编译 sub() #替换 match () #从头匹配数据 search() #查找 正则表达式的一元字符: . #该符号 点 匹配所有符号,除了换行符(\n) \w #匹配有效符号(python3中包含了各国常用的语言符号) [ A-Za-z0-9_ ] #匹配有效符号 \d #匹配数字 \s #匹配空白位(空格、\t制表符) [abcdef] #匹配中括号中的某一个符号(列举): [a-z] #中括号中若出现 - 表...

Wuhao9_的博客 3325

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5091

正则表达式[\w]+,\w+,[\w+] 三者区别? [],[ABC]+,[\w./-]+ 表达什么?

正则表达式[\w]+,\w+,[\w+] 三者有何区别: [\w]+和\w+没有区别,都是匹配数字和字母下划线的多个字符; [\w+]表示匹配数字、字母、下划线和加号本身字符; [] 表示数组而非排列,即不按固定次序位置排列; 在[]内的字符可以任意次序出现。 [ABC]+ 可以匹配"AAABBBCCC,BBBAAACCC,BACCBACAACBAC,...",不是一定

哈里·雪利博客 11万+

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 336

【100%通过率】华为OD机试真题 Python 实现【高矮个子排队】【2023 Q2 | 100分】

我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,每一个“高”位置的小朋友要比相邻的位置高或者相等;要求小朋友们移动的距离和最小,第一个从“高”位开始排,输出最小移动距离即可。移动距离的定义如下所示:第二位小朋友移到第三位小朋友后面,移动距离为1,若移动到第四位小朋友后面,移动距离为2。现在有一队小朋友,他们高矮不同,,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。1:其实题目理解之后就知道,目标是要保证最小移动距离,且以高位为起点。2:try catch 异常处理。

MISAYAONE的博客 3144

Python正则表达式书写容易碰到的陷阱:\W*和\W*?匹配过程遇到的问题

老猿在分析《Python正则表达式W+和W*匹配过程的深入分析》中的问题时,想到一个问题,如果“re.split(’(\W*)’,‘Hello,world’)”的处理如果换成非贪婪模式会怎么样,根据老猿的预测,由于在’Hello,world’中没有连续的非单词字符,因此贪婪模式处理和非贪婪模式结果应该一样,如是测试了一下看看效果: >>> re.split('(\W*)','He...

老猿Python 1811

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2881

Python正则表达式re模块学习遇到的问题

Python正则表达式处理的组是什么?

老猿Python 1673

[STC32G144K246入门第一步]点亮LED

STC32G144K246是一款高性能32位8051单片机,集成了丰富外设资源,适用于工业控制和复杂算法处理。该芯片支持双模式内核,内置硬件加速器,提供246KB Flash和144KB SRAM存储空间。文章详细介绍了开发环境搭建步骤、寄存器配置方法,并给出了LED驱动示例代码,通过推挽输出控制P42口实现闪烁效果。虽然开发环境相比ARM存在不足,但通过合理配置仍可满足项目需求。该教程为开发者快速上手STC32G144K246提供了实用参考。

sinat_58149788的博客 795

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python进阶指南5:正则表达式

正则表达式是一种用于匹配复杂字符串模式的工具,广泛应用于数据验证、搜索、替换等场景。Python通过re模块支持正则表达式操作,主要方法包括match()、findall()和finditer()。正则表达式由普通字符和元字符组成,通过字符簇、量词等语法实现精确匹配。基础语法包括匹配字符(.、\d等)、控制出现次数(*、+、?等)和定位字符(^、$)。例如,\d匹配数字,[a-z]匹配小写字母,{m,n}控制字符出现次数。正则表达式功能强大,可用于表单验证、数据过滤等场景,是编程中处理字符串的重要工具。

A5522000的博客 1093

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python的re的split函数_第11.22节 Python 中re模块的字符串分割器:split函数

二、语法释义调用语法:re.split(pattern, string, maxsplit=0, flags=0)参数及返回结果释义:1)这个函数的功能与字符串的split方法有些类似,只是字符串内split是固定分隔符,而这是用 正则表达式来分开 string,分开的字符存放在返回的列表元素内。2)如果在 pattern 对应正则表达式中存在元字符“()”,且能匹配到搜索文本,那么每个匹配组里的...

weixin_39631007的博客 658

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

正则表达式实战指南:从模式匹配到高效数据处理

正则表达式作为文本处理的瑞士军刀,在数据清洗、日志分析、表单验证等场景中发挥着不可替代的作用。无论是前端开发者处理用户输入,还是后端工程师分析日志文件,掌握正则表达式都能极大提升工作效率。本文将通过实际应用场景,深入解析正则表达式的核心概念与实用技巧。 ## 为什么正则表达式在现代开发中依然重要? 在当今数据驱动的时代,文本处理是每个开发者都无法回避的任务。正则表达式提供了一种强大而灵活的模式

gitblog_00520的博客 361

Python正则表达式re.findall("[A-Za-z]([A-Za-z0-9])*[.]txt",'Abc2019.txt')的结果为什么是['9']

在《Python妙用re.sub分析正则表达式匹配过程》中老猿分析了findall函数的返回情况,老猿前一阵子在执行这个语句时: >>> re.findall("[A-Za-z]([A-Za-z0-9])*[.]txt",'Abc2019.txt') ['9'] >>> 没有弄明白为什么是这个结果,我们使用《Python妙用re.sub分析正则表达式匹配过程》...

老猿Python 5120

Go与Python正则表达式性能对比与优化

正则表达式是文本处理的核心技术,其实现原理直接影响匹配效率。现代编程语言通常采用DFA/NFA状态机模型,通过预编译和缓存优化提升性能。在工程实践中,正则表达式广泛用于日志解析、数据验证和路由匹配等场景。Go语言出于安全性和并发控制考虑,采用纯Go实现的正则引擎,虽然性能不及Python的PCRE实现,但通过预编译、字符串操作替代等优化手段仍可满足大多数需求。针对ReDoS攻击防护和协程安全的设计,使Go在处理用户输入时更具优势。

weixin_30086969的博客 7

第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也

正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜。 在写标题时,本来想写“正则表达式小结”,后来想了想,百度了一下,牵强附会用了这个标题。不解释了! 在写Python正则表达式re处理模块之前,老猿其实是心存畏难情绪、摇摆了几次,到底自己要学习到什么程度、又要写到什么程度,才开始想写一个单章、后来想合并到一个老猿构想的《基础篇结束章节...

老猿Python 1142

第11.22节 Python 中re模块的字符串分割器:split函数

一、 引言 在《第11.2节 Python 正则表达式支持函数概览》介绍了re模块的主要函数,在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》重点介绍了几个搜索函数,后续章节将介绍re模块的其他函数,本节先介绍re.split函数的功能。 二、 语法释义 调用语法: re.split(pattern, strin...

老猿Python 2745

正则表达式匹配实战:语法拆解与性能优化

文本处理中,模式匹配是提取、校验和清洗数据的核心手段。正则表达式作为一种声明式的模式描述语言,通过元字符、量词与锚点的组合,能以极简规则匹配复杂的字符串结构。理解其匹配原理,掌握贪婪与懒惰量词的区别,认识回溯失控的风险,是高效使用正则的关键。在日志分析、表单验证、爬虫解析等场景中,正则表达式不仅能替代繁琐的字符串循环,还能借助捕获组与零宽断言实现更精细的提取。本文从基础语法入手,结合Python与JavaScript的实践案例,剖析常见陷阱与性能问题,帮助开发者写出既准确又高效的正则表达式。

weixin_30899023的博客 331

手机号校验到SQL Server:正则表达式入门与实战

正则表达式(regex)是一种用模式描述文本形状的匹配语言,核心由字符类、量词、分组、锚点与断言组成。它不关心具体内容,而是通过规则引擎判断字符串是否符合某种结构,因此适合格式校验、信息抽取和批量替换。在工程实践中,手机号校验、日志解析、日期统一、SQL Server 文本过滤等场景,常从硬编码判断转向 regex 模式。掌握贪婪与懒惰、捕获组、零宽断言和边界控制,能减少误匹配,也能规避回溯灾难带来的性能问题。围绕这些高频问题,下面从可复用的手机号规则切入,逐步串起 Python re 入口、常用模板与排错

weixin_34310369的博客 309
上一篇: 第11.24节 Python 中re模块的其他函数
下一篇: Python正则表达式书写容易碰到的陷阱:\W*和\W*?匹配过程遇到的问题
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值