Python:正则表达式相关整理

最近因为一些原因频繁使用正则表达式,因为以前系统整理过关于正则表达式的相关知识,所以这里仅记录使用期间遇到的问题。

本文内容基于re

1. match和search方法的区别

在Python中,re.searchre.match都是用于匹配字符串的正则表达式函数,但二者在匹配模式上有明显的区别。具体如下:

  • re.match: 该函数只在字符串的开始位置进行匹配。如果开头不匹配,就不会继续匹配下去。其作用类似于从字符串的开位置起寻找能找到符合正则表达式模式的子串。
  • re.search: 该函数会在整个字符串中搜索,直到找到一个匹配的子字符串。其作用类似于从完整的字符串中找到与正则表达式完整匹配的子串。

代码举例如下:

python 复制代码
import re
rule=r'(ab|cd).*(ef|gh)' #以ab或cd开头,以ef或gh结尾的字符串
str1='abef'
str2="dcabefabef"
str3="abxyefabstefsc"
print(re.match(rule,str1)) 
print(re.match(rule,str2)) 
print(re.match(rule,str3)) 
print(re.search(rule,str1)) 
print(re.search(rule,str2))
print(re.search(rule,str3)) 

其代码执行结果如下:

bash 复制代码
<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 12), match='abxyefabstef'>
<re.Match object; span=(0, 4), match='abef'>
<re.Match object; span=(2, 10), match='abefabef'>
<re.Match object; span=(0, 12), match='abxyefabstef'>

从执行结果中可以发现,这两个方法的返回类型是一样的。

另外,使用^$可以验证完整的字符串是否符合正则表达式规定的模式。具体举例如下:

python 复制代码
rule=r'^(ab|cd).*(ef|gh)$' #以ab或cd开头,以ef或gh结尾的字符串
str1='abef'
str2="dcabefabef"
print(re.match(rule,str1)) 
print(re.match(rule,str2)) 
print(re.search(rule,str1)) 
print(re.search(rule,str2))

其执行结果如下:

bash 复制代码
<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 4), match='abef'>
None
2. 利用正则表达式实现某些字符必须出现某些字符不能出现的效果

组合使用零宽断言可以实现利用利用正则表达式实现某些字符必须出现某些字符不能出现的效果。具体举例如下:

python 复制代码
rule=r'^(?=.*(ab|cd))(?!.*xy).*$' #ab或cd必须出现,且不能包含xy
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"

print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其结果如下:

bash 复制代码
<re.Match object; span=(0, 9), match='132ab23re'>
None
None

但是在使用这种方式的时候要注意一点(ab|cd)的后面不要添加.*, 这个需要放到xy的前面,否则实现不了同样的效果,展示如下:

python 复制代码
import re

rule=r'^(?=.*(ab|cd).*)(?!xy)$'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"

print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其执行结果如下:

bash 复制代码
None
None
None

从结果中我们可以看到,str1和str2是符合要求但结果并没有匹配上。

另外,在这种情况下^$的使用也需要注意,如果不添加这两种断言,结果可能也是错误的。展示如下:

python 复制代码
import re

rule=r'(?=.*(ab|cd))(?!.*xy)'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"

print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其结果如下:

bash 复制代码
<re.Match object; span=(0, 0), match=''>
None
None
相关推荐
红茶要加冰1 天前
七、正则表达式
linux·运维·正则表达式·shell
Pocker_Spades_A2 天前
Python快速入门专业版(五十八)——正则表达式(re):爬虫文本提取利器(从语法到实战)
爬虫·python·正则表达式
红茶要加冰2 天前
九、文本处理三剑客——sed
linux·运维·服务器·正则表达式·shell
Bug-制造者2 天前
正则表达式 vs Shell通配符:彻底分清,告别命令行踩坑
linux·正则表达式
剑神一笑4 天前
Linux top 命令深度解析:进程监控的性能优化实战
linux·运维·正则表达式
jayson.h4 天前
正则表达式:从文件名提取器件编号
开发语言·python·正则表达式
水木流年追梦4 天前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
gCode Teacher 格码致知5 天前
Python教学:正则表达式中的match 和fullmatch的经典使用-由Deepseek产生
python·正则表达式
gCode Teacher 格码致知5 天前
Python教学:正则表达式的寻找、匹配、替换、删除 四种模式案例-由Deepseek产生
开发语言·python·正则表达式
yuananyun5 天前
正则性能与灾难性回溯:如何写得快且稳,并避免线上卡死
正则表达式·正则性能优化·redos攻击