Python 正则表达式中的`^`和`[]`及常见含义
前言^和[]是正则里出镜率最高、也最容易理解错的两个符号。^在不同位置有完全不同的含义写在模式开头是「串首锚点」写在方括号内的第一个位置是「取反」写在方括号内的其它位置又只是普通的尖角号字符。[]则是「字符集」它内部有一套自己的规则——哪些字符有特殊含义、-怎么表示范围、]怎么放进去都和方括号外不一样。很多人把它们混着用的后果是想「匹配一个非数字开头的串」却写成^[0-9]结果语义正好反了。本文把这两个符号在类内和类外的行为逐条对照配可运行的例子说清楚。示例基于 Python 3.8。另有必要提一句Python 2.7 已于 2020 年 1 月 1 日停止维护在 Python 2 里字符串默认是 bytes\d、\w只认 ASCII想看 Unicode 语义还得额外加re.UNICODE这些差异在 Python 3 里已经默认帮你处理好了。一、^的三副面孔先看^写法^的位置含义^abc方括号外锚点匹配字符串开头[^abc]方括号内首位取反匹配 a、b、c 之外的字符[a^bc]方括号内非首位普通字符^# 适用于 Python 3.8import re# 类外锚点只匹配串首print(re.findall(r^#.*, a\n# b\n# c)) # [] 默认只认整串开头print(re.findall(r^#.*, a\n# b\n# c, re.M)) # [# b, # c] 按行# 类内首位取反print(re.findall(r[^#], #a#b)) # [a, b]# 类内非首位字面量print(re.findall(r[a#b], #a#b)) # [#, a, #, b]第一行返回空列表正是新手最容易懵的点^默认只匹配整个字符串的开头不是每一行。要让它对每一行生效必须加re.MULTILINE行内写(?m)。再看和^对应的$。$匹配字符串末尾加了re.MULTILINE后匹配每一行末尾它还有一个微妙之处——默认情况下$也匹配「结尾换行符之前」的位置# 适用于 Python 3.8import reprint(re.search(rfoo$, foo\n)) # 匹配成功$ 认末尾换行前的位置print(re.search(rfoo\Z, foo\n)) # None\Z 要求正好在字符串末尾\Z表示「字符串绝对末尾」从 Python 3.14 起还新增了等价的\z\Z与之相同。二、[]字符集类内的规则方括号建立一个「字符集」匹配其中任意一个字符。类内的规则和类外差别很大目标写法说明枚举若干字符[abc]a、b、c 之一表示范围[a-z]小写字母组合范围[A-Za-z0-9_]字母、数字、下划线取反[^0-9]非数字字面量-[-az]或[a\-z]放首位 / 末位 / 转义字面量][]a]或[a\]]放首位 / 转义字面量.[.]类内 * ? .都失去特殊含义# 适用于 Python 3.8import reprint(re.findall(r[A-Za-z0-9_], id_1 AND x9)) # [id_1, AND, x9]print(re.findall(r[a\-z], a-z)) # [a, -, z]print(re.findall(r[-az], a-z)) # [a, -, z]# 类外的 . 是「任意字符」类内的 [.] 只匹配真正的点号print(re.findall(r., a.b)) # [a, ., b]print(re.findall(r[.], a.b)) # [.]记住两条类内的 * ? . ( )等特殊符号都退化成普通字符唯一还保留转义能力的是反斜杠所以[\d]、[\w]、[\s]、[\n]、[\x41]在类内依然有效。# 适用于 Python 3.8import reprint(re.findall(r[\d], a1b2)) # [1, 2]print(re.findall(r[\w], a-1_b)) # [a, 1_b]三、^与[]组合时的坑把^和[]拼在一起是高频操作也是最容易写反的地方。对照下面两行# 适用于 Python 3.8import res 3 applesprint(re.findall(r^[0-9], s)) # [3] 以数字开头print(re.findall(r[^0-9], s)) # [ , a, p, p, l, e, s] 所有非数字^[0-9]是「开头位置紧接一个数字」只可能返回一个字符[^0-9]是「任意非数字字符」会把整串里的非数字全找出来。两者语义完全不同只有一个方括号的位置之差。另一个常见误区是范围的端点。[A-z]看着像「所有字母」但它包含的是 ASCII 码 65 到 122 之间的全部字符中间夹着[ \ ] ^ _ \ 这些标点# 适用于 Python 3.8import reprint(re.findall(r[A-z], aZ_[])) # 下划线、方括号都被吃了进来要「所有字母」请老老实实写[A-Za-z]别用[A-z]偷懒。四、类内可用的转义方括号内支持的转义和类外大体一致但有两处要注意\b在类外是单词边界在类内表示退格字符backspace。两者含义完全不同。\uXXXX、\UXXXXXXXX、\N{名称}这些在 Unicodestr模式里有效在 bytes 模式里会报错。# 适用于 Python 3.8import reprint(re.findall(r[一-鿿], 中文abc)) # [中文][一-鿿]和直接用中文字符写的[一-鿿]等价写转义形式在源码里更直观地表明「这是按码位圈定的范围」。五、两个容易被忽略的细节细节一VERBOSE 模式下的空白。re.VERBOSE或行内(?x)会忽略模式里的空白和#注释方便排版但字符集内部的空白是有意义的不受这个规则影响# 适用于 Python 3.8import re# (?x) 下模式里的空格被忽略但 [ ] 里的空格仍然只匹配空格print(re.findall(r(?x) [ ] # 匹配一个空格, a b)) # [ ]正因为如此在VERBOSE模式里想匹配一个真正的空格写[ ]比写转义的\更不容易看漏。细节二字符集不能为空。单独的[]并不是「空集合」而是「未闭合」——因为紧跟[的]会被当成字面量成员于是整个字符集没有收尾的]编译直接报错# 适用于 Python 3.8import retry:re.compile([])except re.error as e: # 3.13 起别名到 re.PatternErrorprint(出错, e)print(re.findall(r[]], a]b)) # []]首位 ] 被当作字面量要匹配]本身就把它放在方括号内首位写成[]]或者写成[\]]。常见坑点❌ 想匹配「非数字」写成^[0-9]实际只匹配「以数字开头的串」。✅ 取反的^必须放进方括号首位[^0-9]。❌ 用^做按行匹配却忘了加re.MULTILINE只匹配到第一行。✅ 按行匹配要re.MULTILINE或行内(?m)否则^只认整串开头。❌ 用[A-z]代替[A-Za-z]把[ \ ] ^ _ \ 也纳入了匹配。✅ 大写和小写各写一段范围[A-Za-z]。❌ 在字符集里写]想匹配右方括号结果它提前结束了字符集模式语法报错。✅ 把]放在方括号内首位[]a]或用反斜杠转义[a\]]。❌ 写[a-z-0-9]这类多个范围连在一起-被当成范围符号结果出乎意料。✅ 字面量-放到首位或末位[-a-z0-9]或写成\-。❌ 以为类外的.和类内的[.]一样用[.]去「匹配任意字符」结果只匹配点号。✅ 任意字符用.配re.S可跨行只匹配点号才用[.]或\.。❌ 在字符集里写[\b]想表达单词边界实际匹配的是退格字符。✅ 单词边界\b只能用在类外类内它是退格。❌ 认为$和\Z完全等价处理「结尾带换行」的文本时匹配范围对不上。✅$默认也认末尾换行符之前的位置\Z以及 3.14 的\z只认字符串绝对末尾。总结符号类外含义类内首位类内非首位^串首锚点取反字面量^$串尾锚点字面量$字面量$.任意字符字面量.字面量.-字面量字面量表示范围]字面量字面量结束字符集一句话记住^的含义取决于它在不在方括号里、以及是不是方括号内的第一个字符。写模式时先把方括号的边界在脑子里圈出来^是锚点还是取反就一目了然^[0-9]和[^0-9]这种一字之差也不会再写反。

相关新闻

三星ML-2165W Linux驱动手动安装与CUPS集成指南

三星ML-2165W Linux驱动手动安装与CUPS集成指南

简介:本资源是三星官方发布的Linux平台打印与扫描驱动程序v1.00.06版,专为使用三星打印机(如CLX-3180sc、CLP-320sc、CLX-6220sc等主流型号)的Linux用户设计,解决在Ubuntu、CentOS等发行版中无法识别设备、无法打印或扫…

2026/10/13 18:17:29 阅读更多 →
抖音式上下滑动视频的工程实现与性能避坑指南

抖音式上下滑动视频的工程实现与性能避坑指南

简介:本资源是一套完整的Android端仿抖音上下滑动切换视频功能实现方案,面向Android中高级开发者及UI动效实践者,解决短视频类App核心交互体验的落地难题。方案基于RecyclerViewSnapHelper自定义LayoutManager技术栈,深度整合ExoP…

2026/10/13 18:17:31 阅读更多 →
Linux下RAR命令行工具rarlinux部署与实战指南

Linux下RAR命令行工具rarlinux部署与实战指南

简介:本资源是Linux平台专用的64位RAR命令行工具正式测试版(v6.1.b1),面向Linux系统管理员、运维工程师及需要处理RAR格式归档的开发人员,解决在无图形界面或批量自动化场景下高效压缩/解压、修复损坏档案、创建AES加密…

2026/10/13 18:22:39 阅读更多 →

最新新闻

金融时间序列建模全流程:从平稳性检验到GARCH波动率预测

金融时间序列建模全流程:从平稳性检验到GARCH波动率预测

1. 从第一节课到第四章:金融时间序列到底在研究什么如果你正在啃金融相关的课程,大概率会在一门叫《金融时间序列分析》或类似名字的课上卡住。这门课和传统统计学、计量经济学都不一样,它研究的是股票收益率、汇率波动、债券利差这类有“先后…

2026/10/14 0:48:55 阅读更多 →
AgenticOps工程:企业自动化运维的自主决策革命

AgenticOps工程:企业自动化运维的自主决策革命

1. AgenticOps Engineering 的本质与价值AgenticOps Engineering 正在重新定义企业自动化运维的边界。与传统自动化工具不同,这种新型工程范式通过赋予系统自主决策能力,使企业IT基础设施能够像拥有"数字员工"一样主动感知环境变化、预测问题并…

2026/10/14 0:48:55 阅读更多 →
用插件重构知识工作流:浏览器、编辑器与知识库的自动化实践

用插件重构知识工作流:浏览器、编辑器与知识库的自动化实践

知识工作者这个词听起来有点抽象,但落到日常就非常具体:你可能天天在写方案、查资料、写代码、记笔记、做汇报,一天结束回头一看,真正用在"思考"上的时间反而不多,大量时间被复制粘贴、切换窗口、找文件、重…

2026/10/14 0:48:55 阅读更多 →
ABAP单元测试效率提升:ADT工具链实战

ABAP单元测试效率提升:ADT工具链实战

1. 项目概述:当ABAP单元测试遇上效率革命在SAP开发领域,ABAP Unit作为核心测试框架已经存在多年,但真正能将其融入日常开发的团队却不多见。问题不在于框架本身,而在于传统测试流程中存在太多效率断层——从编写测试用例到执行测试…

2026/10/14 0:48:55 阅读更多 →
Python远程批量关机实战:WinRM/WMI/SMB三路径选型与避坑

Python远程批量关机实战:WinRM/WMI/SMB三路径选型与避坑

简介:本资源是一份面向Windows系统管理员与IT运维人员的Python自动化脚本工具包,解决多台设备集中管理场景下的远程批量关机需求,适用于机房巡检、课室终端维护、故障应急处置等实际运维任务。压缩包共3个文件(923B)&a…

2026/10/14 0:48:55 阅读更多 →
尖叫声音样本数据集eva:从包结构到训练基线的完整实践

尖叫声音样本数据集eva:从包结构到训练基线的完整实践

简介:EVA尖叫声音样本数据集是一份面向音乐信息检索(MIR)与音频分类研究的人声尖叫样本库,由台湾清华大学MIR课程项目整理,旨在为尖叫检测、异常声音识别、SVM分类等实验提供稀缺的领域数据。压缩包共63个文件&#xf…

2026/10/14 0:47:55 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →