正则表达式

本文深入探讨了正则表达式的不同类别,包括基本正则表达式(BRE)、扩展正则表达式(ERE)和Perl兼容正则表达式(PCRE),并详细解析了正则表达式的元字符、重复规则、捕获、零宽断言及引擎选项等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式
分类

  1. BRE
    基本正则表达式,grep sed vi等软件支持.vim由扩展
  2. ERE
    扩展正则表达式,egrep (grep-E) sed -r等
  3. PCRE
    几乎所有好几语言都是PCRE的方言或者变种.python从1.6开始使用SRE正则表达式殷勤,可以认为是PCRE的子集,见模块re

基本语法
元字符 metacharacter

元字符说明
.匹配除换行符外任意一个字符
[abc]字符集和,只能表示一个字符位置.匹配所包含的任意一个字符
[^abc]字符集和,只能表示一个字符位置.匹配除集合包含的任意一个字符
[a-z]字符范围,也是个集合,表示一个字符位置,匹配所包含的任意一个字符
[^a-z]字符范围,表示一个字符位置,匹配除去集合内字符的任意一个字符
\b匹配单词的边界
\B不匹配单词的边界
\d等价于[0-9]匹配一位数字
\D等价于[^0-9]匹配一位非数字
\s匹配1位空白字符,包括换行符 制表符 空格 [\f\r\n\v]
\S匹配一位非空白字符 [^\f\r\n\v]
\w匹配一位包括下划线和中文的任何单词字符,类似于[A-Za-z0-9_]
\W匹配任何非单词字符,等价于[^A-Za-z0-9_]

重复

元字符说明
*表示前面正则表达式会重复0次或多次
+表示前面的正则表达式重复至少1次
?表示前面的正则表达式会重复0次或1次
{n}重复固定的n次
{n,}重复至少n次
{n,m}重复n到m次
元字符说明举例
x|y匹配x或者ywood took foot food 使用w|food或者(w|f)ood
捕获使用小括号指定一个子表达式,也叫分组,捕获后会自动分配组好从1开始,可以改变优先级
\数字匹配对应的分组(very)\1very very,但捕获的组group是very
(?:pattern)如果仅仅为了改变优先级,就不需要捕获分组(?:w|f)ood
(?<name>exp)(?'name’exp)命名分组捕获,但是可以通过name访问分组,python语法必须是(?P<name>exp)
零宽断言
(?=exp)零宽度正预测先行断言,断言exp一定在匹配的右边出现,也就是说断言后面一定跟个expf(?=oo)f后面一定有oo出现
(?<=exp)零宽度正回顾后发断言,断言exp一定出现在匹配的左边,前面一定有个exp前缀(?<=f)ood (?<=t>)ook分别匹配ood ook,ook前一定有t出现
负向零宽断言
(?!exp)零宽度负预测先行断言,断言exp一定不会出现在右侧,也就是说断言后面一定不是exp\d{3}(?!\d)匹配3位数字,断言3位数字后面一定不是数字,foo(?!d)foo后面一定不是d
(?<!exp)零宽度负回顾后发断言,断言exp一定不能出现在左侧,也就是说断言前面一定不能是exp(?<!f)ood ood的左边一定不是f
(?#comment)注释f(?=oo)(?#这个后断言不捕获)

分组和捕获是同一个意思
使用正则表达式时,能用简单表达式,就不要复杂的表达式

贪婪与非贪婪
默认是贪婪模式,就是尽量多匹配更长的字符串
非贪婪,在重复的符号后面加上一个?问号,就尽量少的匹配了

代码说明
*?匹配任意次,但尽可能少重复
+?匹配至少1次,但尽可能少重复
??匹配0次或1次,但尽可能少重复
{n,}?匹配至少n次,但尽可能少重复
{n,m}?匹配至少n次,至多m次,尽可能少重复

引擎选项

代码说明Python
lgnoreCase匹配时忽略大小写re.l re.IGNORECASE
Singleline单行模式,可以匹配所有字符,包括\nre.S re.DOTALL
Multiline多行模式^行首 $行尾re.M re.MULTILINE
IgnorePatternWhitespace忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释re.X re.VERBOSE
单行模式:
. 可以匹配所有字符,包括换行符
^ 表示整个字符串的开头,$整个字符串的结尾

多行模式:
. 可以匹配除了换行符之外的字符,多行不影响.点
^ 表示行首,$行尾,这里是每一个行
默认模式:可以看做匹配的文本是一行,不能看做多行, .点号不能匹配换行符,^和$表示行首和行尾,而行首行尾就是整个字符串的开头和结尾
单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这是所有文本就是一个长长的只有一行的字符串.^就是这一行字符串的行首,$就是这一行的行尾.
多行模式:重新定义了行的概念,但不影响.点号的行为,^和$还是行首行尾的意思,只不过因为多行模式可以识别换行符了."开始"指的是\n前的字符,注意最后一行结尾可以没有\n

简单讲,单行模式只影响.点号行为,多行模式重新定义行影响了^和$
注意:字符串中看不见的换行符,\r\n会影响e$的测试,e$只能匹配e\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值