Python re模块正则使用方法(二)

1,199 阅读8分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

复习回顾

正则表达式(Regular Expression)用于描述一种字符串匹配的模式(Pattern),目前Python、C#、PHP、Javascript等语言都支持正则表达式。

我们都知道正则表达式它可用于检查一个字符串是否含有某个子串,也可以用于从字符串中提取匹配子串,亦或者对字符串中匹配的子串执行操作。

我们在前面已经学习了两期了,具体详情如下

  • 正则表达式语法,学习正则表示达式常见的语言法及执行引擎原理的学习

  • complie编译正则对象,对Python re模块支持的匹配模式常量的了解、正则对象编译的方法re.compile()方法的学习

Python 内置库 re模块里包含9个常量、12个方法

我们已经学习了正则的编译方法,本期将继续学习re模块匹配查找、替换、分割常用方法的使用

1. 查找返回一个匹配项

方法作用
res.search(pattern,string,flags)扫描整个字符串,正则表达式进行匹配
res.match(pattern,string,flags)从检测的字符串的开始位置来匹配正则表达式。
res.fullmatch(pattern,string,flags)整个检测的字符串与正则表达式进行匹配

1.1 re.match()

res.match(pattern,string,flags=0)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 从被匹配的字符串的开始位置进行匹配正则表达式
  • 如果从开始位置匹配不成功,match函数则返回None
  • 如果从开始位置可以进行匹配,则会返回一个_sre.SRE_Match对象
  • _sre.SRE_Match对象 包含spa(n)获取第n+1组开始和结束位置,group(n)获取第n+1组的匹配的子串

举个栗子🌰:

import re

# match 从子串开头进行匹配
pattern = "Jue"
# 开头位置匹配成功
match1 = re.match(pattern,"Juejin")
print("开头匹配成功:",match1.group())
# 开头位置匹配不成功
match2 = re.match(pattern,"hello Juejin")
print("开头匹配不成功:",match2)

运行结果:

1.2 re.search()

res.search(pattern,string,flags=0)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 扫描整个字符串,进行匹配正则表达式
  • 如果字符串没有匹配,search函数则会返回None
  • 如果找到匹配的字符串,search函数则会返回第一个匹配对象_sre.SRE_Match
  • _sre.SRE_Match对象 包含spa(n)获取第n+1组开始和结束位置,group(n)获取第n+1组的匹配的子串

举个栗子🌰:

import re

# search 任意位置进行匹配
pattern = "Jue"
# 匹配1
match1 = re.search(pattern,"Juejin")
print("匹配1:",match1)
# 匹配2
match2 = re.search(pattern,"hello Juejin")
print("匹配2:",match2)

运行结果:

1.3 re.fullmatch(pattern,string,flags)

res.fullmatch(pattern,string,flags=0)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 整个字符串与正则表达式进行完全匹配
  • 如果字符串与正则表达式不能完全匹配,则会返回None
  • 如果可以匹配,则会返回包含匹配信息的_sre.SRE_Match对象
  • _sre.SRE_Match对象 包含spa(n)获取第n+1组开始和结束位置,group(n)获取第n+1组的匹配的子串

举个栗子🌰:

import re

# fullmatch 字符串要与正则表达式全匹配
pattern = "Jue"
# 匹配成功
match1 = re.fullmatch(pattern,"Jue")
print("字符串与正则全匹配:",match1)
# 匹配不成功
match2 = re.fullmatch(pattern,"Juejin")
print("字符串与正则不全匹配:",match2)

运行结果:

2. 查找返回多个匹配项

方法作用
re.findall(pattern,string,flags)以列表的形式返回搜索字符串中与正则表达式匹配的所有子串
re.finditer(pattern,string,flags)以迭代器的形式返回搜索字符串中与正则表达式匹配的所有子串

2.1 re.findall()

re.findall(pattern,string,flags)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 扫描整个字符串,进行正则表达式匹配
  • 找到所有能满足正则表达式的子串
  • 结果以列表的形式返回

举个栗子🌰:

import re

# findall 扫描整个字符串要与正则表达式匹配,并返回一个列表
pattern = "Jue"
# 结果返回一个列表
match1 = re.findall(pattern,"hello Juejing,love Juejin")
print("字符串匹配多个结果:",match1)

运行结果:

2.2 re.finditer()

re.finditer(pattern,string,flags=0)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 扫描整个字符串,进行正则表达式匹配
  • 找到所有能满足正则表达式的子串
  • 结果以迭代器的形式返回

举个栗子🌰:

import re

# finditer 扫描整个字符串要与正则表达式匹配,并返回一个迭代器
pattern = "Jue"
# 结果返回一个迭代器
match1 = re.finditer(pattern,"hello Juejing,love Juejin")
print("字符串匹配多个结果:",list(match1))

运行结果:

3. 分割方法

re.split(pattern,string,maxsplit=0,flags=0)

参数:

  • pattern: 代表正则表达式
  • string: 代表被匹配的字符串
  • maxsplit: 代表控制最多进行分割几次
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 正则表达式对字符串进行分割
  • 分割得到的多个子串组合成一个列表进行返回

举个栗子🌰:

import re

# split 正则表达式进行匹配字符串进行分割,返回一个列表
pattern = ","
# 结果返回一个列表
match1 = re.split(pattern,"Juejin1,Juejin2,Juejin3")
print("字符串分割:",list(match1))

运行结果:

4. 替换方法

方法作用
re.sub()替换字符串中与正则表达式匹配的count个子串,返回替换后的字符串
re.subn()替换字符串中与正则表达式匹配的字符串,返回替换后的字符串和替换次数

4.1 re.sub()

re.sub(pattern,repl,string,count=0,flags=0)

参数:

  • pattern: 代表正则表达式
  • repl: 代表被替换的字符串,也可以是一个函数
  • string: 代表被匹配的字符串
  • count: 代表控制最多替换多少次次,count=0,代表全部替换
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

🌟:当repl为函数时,只能有个入参:Match匹配对象

功能:

  • 将字符串中匹配到的正则表达式的子串
  • 将匹配到的子串替换成repl,并返回替换后的字符串
  • 当不指定count时,默认是全部替换

举个栗子🌰:

import re

# sub 正则表达式进行匹配字符串进行替换,返回替换之后的字符串
pattern = ","
repl = "/"
# 全部进行替换
match1 = re.sub(pattern,repl,"Juejin1,Juejin2,Juejin3")
print("字符串全部替换:",match1)
# 进行替换1次
match2 = re.sub(pattern,repl,"Juejin1,Juejin2,Juejin3",1)
print("字符串替换1次:",match2)

运行结果:

4.2 re.subn()

re.subn(pattern,repl,string,count=0,flags=0)

参数:

  • pattern: 代表正则表达式
  • repl: 代表被替换的字符串,也可以是一个函数
  • string: 代表被匹配的字符串
  • count: 代表控制最多替换多少次次,count=0,代表全部替换
  • flags: 代表编译正则表达式指定的匹配模式(9个常量)

功能:

  • 将字符串中匹配到的正则表达式的子串
  • 将匹配到的子串替换成repl,并返回一个元组(字符串,替换次数)

举个栗子🌰:

import re

# subn 正则表达式进行匹配字符串进行替换,返回替换之后的字符串和次数
pattern = ","
repl = "/"
# 全部进行替换
match1 = re.subn(pattern,repl,"Juejin1,Juejin2,Juejin3")
print("字符串全部替换:",match1)
# 进行替换1次
match2 = re.subn(pattern,repl,"Juejin1,Juejin2,Juejin3",1)
print("字符串替换1次:",match2)

运行结果:

5. 其他方法

方法作用
re.escape()转义正则表达式中的特殊字符
re.purge()清除正则表达式的缓存

5.1 re.escape()

re.escape(pattern)

参数:

  • pattern: 代表是正则表达式

功能:

  • 对正则表达式中具有特殊含义的字符串进行转义
  • 转义具体包括除ASCII字符、数值、下画线(_)之外的其他字符

🌟建议: re.escape()方法使用时,很容易转换错误,建议尽量少使用此方法,可以用r""来进行替换

举个栗子🌰:

import re

# escape 正则表达式里包含的特殊字符进行转义
pattern = "Jue.Jue*"

# 对正则表达式进行转义
print("转义之后:",re.escape(pattern))

# search 进行匹配查找
match1 = re.search(pattern,"Juejin1,Jue.Jue*,Juejin3")
print("字符串全部替换:",match1)

运行结果:

5.2 re.purge()

功能:

  • 清除正则表达式缓存

代码内部实现

将re.compile()编译的正则对象,转换成'NoneType'对象

总结

本期,我们详细学习了re模块常用的方法,单项匹配、多匹配、替换、分割等方法的使用

这方便我们在日常中能高效使用正则表达式在Python代码中使用

以上是本期内容,欢迎大佬们点赞评论,我们下期见~