共计 2615 个字符,预计需要花费 7 分钟才能阅读完成。
一、正则高级用法
1、分组
-
概念
处理简单的判断是否匹配之外,正则表达式还有提取子串的功能,用 () 表示的就是要提取的分组
-
代码
import re ret = re.search(r"(?P<phone>(?P<quhao>0\d{2,3})-(\d{7,8}))", "zutuanxue_com's phone is 010-88888888") print(ret) # 组的排序:从外到内,从左到右 print(ret.group(0)) # 组中下标为 0 的表示原数据 print(ret.group("phone")) print(ret.group(1)) print(ret.group("quhao")) # 可以根据组的名字获取组的数据 print(ret.group(2)) print(ret.group(3)) # 查看匹配的各组的数据 print(ret.groups())
-
说明
- 正则表达式中定义了组,就可以在 Match 对象上用 group()方法提取出子串来
- group(0)永远是原始字符串,group(1)、group(2)……表示第 1、2、……个子串
2、编译
-
概念
当在 python 中使用正则表达式时,re 模块会做两件事,一件是编译正则表达式,如果表达式的字符串本身不合法,会报错。另一件是用编译好的正则表达式提取匹配字符串
-
编译优点
如果一个正则表达式要使用几千遍,每一次都会编译,出于效率的考虑进行正则表达式的编译,就不需要每次都编译了,节省了编译的时间,从而提升效率
-
compile()函数
-
原型
def compile(pattern, flags=0)
-
作用
将 pattern 模式编译成正则对象
-
参数
参数 说明 pattern 匹配的正则表达式(一种字符串的模式) flags 标识位,用于控制正则表达式的匹配方式 -
flags
值 说明 re.I 是匹配对大小写不敏感 re.L 做本地化识别匹配 re.M 多行匹配,影响到 ^ 和 $ re.S 使. 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式 -
返回值
编译好的正则对象
-
示例
import re re_phone = re.compile(r"(0\d{2,3}-\d{7,8})") print(re_phone, type(re_phone))
-
-
编译后其他方法的使用
原型
def match(self, string, pos=0, endpos=-1) def search(self, string, pos=0, endpos=-1) def findall(self, string, pos=0, endpos=-1) def finditer(self, string, pos=0, endpos=-1)
参数
参数 说明 string 待匹配的字符串 pos 从 string 字符串 pos 下标开始 endpos 结束下标 示例
s1 = "zutuanxue_com's phone is 010-88888888" s2 = "kaige's phone is 010-99999999" ret1 = re_phone.search(s1) print(ret1, ret1.group(1)) ret2 = re_phone.search(s2) print(ret2, ret2.group(1))
3、贪婪匹配
-
贪婪概念
匹配尽可能多的字符
import re print(re.findall(r"(\d+0)", "12340567085465046567"))
-
非贪婪概念
尽可能少的匹配称为非贪婪匹配,*?、+? 即可
import re print(re.findall(r"(\d+?0)", "12340567085465046567"))
-
常见示例
/* part1 */ /* part2 */
import re s = '''/* zutuanxue_com good */ dsdgergaergser /* kaige nice */''' print(re.findall(r"/\* (.*) \*/", s)) print(re.findall(r"/\* (.*?) \*/", s))
二、高级使用
1、字符串切割
-
早期字符串切割代码
s1 = "zutuanxue_com is a good man" print(s1.split(" "))
-
现在的需求
字符串 ”zutuanxue_com is a good man” 中的单词切割出来(注意字符串中空格个数不定)
-
正则中的 split()函数
原型:re.split(pattern, string)
作用:切割字符串
-
解决需求
import re s2 = "zutuanxue_com is a good man" print(re.split(r"\s+", s2))
-
切割 ”zutuanxue_com#is$a%good&man” 中的单词
import re s3 = "zutuanxue_com#is$a%good&man" print(re.split(r"[#$%&]", s3))
2、字符串替换
-
早期字符串替换代码
s1 = "zutuanxue_com is a good man" s2 = s1.replace("good", "nice") print(s2)
-
现在的需求
将字符串 ”zutuanxue_com is a good man!zutuanxue_com is a nice man!zutuanxue_com is a cool man” 中的 ”good”、“nice”、“cool” 都改为 ”handsome”
-
sub 函数与 subn()函数
-
原型
def sub(pattern, repl, string, count=0, flags=0) def subn(pattern, repl, string, count=0, flags=0)
-
作用
在目标字符串 string 中查找匹配的 pattern 模式的字符串,再把它们替换成指定 repl 字符串,可以指定最多替换 count 次,否则替换所有
-
区别
a、sub 返回一个替代后的字符串
b、subn 返回一个元组,元组的第一个元素为替换后的字符串,第二个元素为替换的次数
-
-
解决需求
import re s3 = "zutuanxue_com is a good man!zutuanxue_com is a nice man!zutuanxue_com is a cool man" print(re.sub(r"good|nice|cool", "handsome", s3)) print(re.subn(r"good|nice|cool", "handsome", s3))