随笔--正则表达式进阶

mac2026-06-09  10

1.避免转义字符引起的问题

使用原字符串定义正则表达式

p = r'正则表达式'

[]中用^取反

\s 匹配到的空格都有[\t\n\f\v\r]

2. 分组的进阶

分组(捕获分组:只捕获分组中内容,其他只要匹配即可)
group()返回匹配的字符串

groups()以元组的形式返回符合所有组中匹配的字符串,一个组为一个字符串

group(n) 第n个分组中匹配到的内容str,组编号是从 1 开始的

start() 返回匹配的起始位置

end() 返回匹配的结束位置

span(group=0) 返回匹配的索引位置元组

span(group=n) 返回匹配第n个组的索引位置出现(){m}一个分组匹配多次的这种情况,span()会将这个组的最后一次匹配索引位置输出 import re p1 = r'(123){2}(da)' m = re.search(p1,'55123123dasdasda123123asd') print(m) print(m.group()) print(m.groups()) print(m.group(1)) // 输出 <_sre.SRE_Match object; span=(2, 10), match='123123da'> 123123da ('123', 'da') 123 【注】(123){2}只分了一个组,{2}只是指匹配两次
分组命名

(?P<分组名>正则表达式)

反向引用分组 (在后期爬虫会用到 )

p = r‘<([\w]+)>.*</\1>’

\1指引用分组([\w]+)匹配到的内容,进行匹配

import re regex = re.compile(r'\d+') str1 = '55123123dasdasda123123' regex2 = re.compile(r'((\w)\w*?\2)') allstr2 = regex2.findall(str1) print(allstr2) # [('55', '5'), ('1231', '1'), ('23dasdasda12', '2'), ('3123', '3')]
非捕获分组

介绍:只是将小括号作为一个整体进行匹配,要捕获整个正则表达式

使用:(?:正则表达式)

3. 编译正则表达式

re.compile(pattern[,flags=0])

使用方式

re.flag名 简写和全称都可以

标识含义re.S ---- re.DOTALL使得.匹配包括换行符在内的所有字符(’.'不包含换行符)re.I ---- re.IGNORECASE使得匹配对大小写不敏感re.M ---- re.MUTILINE多行匹配。(影响^和$)re.X ---- re.VERBOSE能够让正则表达式组织(表现)的清晰易懂。为了增加可读性,忽略空格和 # 后面的注释re.A — re.ASCII采用ASCII编码re.U — re.UNICODE采用UNICODE编码

4. 常用的方法(快速回忆)

1. re.match(pattern, string, flag=0)
2. re.search(pattern, string, flag=0)
3. re.findall(pattern, string, flag=0) 返回一个列表
4. re.finditer(pattern, string, flag=0)
5. re.sub(pattern, rep1, string, count=0 , flag=0)
替换字符串
count:替换次数;count默认为0,表示次数无限制
6. re.subn(pattern, rep1, string, flag=0 )
替换字符串并返回替换的次数
7. re.spilt(pattern,string,maxsplit = 0,flag=0)
切割字符串
maxsplit:为最大分割次数;maxsplit = 0, 默认为0,表示分割次数没有限制
8. re.compile(pattern, flag=0)
函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,提高效率
多个标志使用’|'间隔开
编译后的对象regex可以直接使用对应的方法
regex.方法(string,[, pos [, endpos ] ] )
string : 待匹配的字符串。pos : 可选参数,指定字符串的起始位置,默认为 0。endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。设置超过字符串长度也不会报错

实例:

regex = re.compile(r'\d+') str1 = '55123123dasdasda123123' allstr = regex.findall(str1,2,len(str1)) print(allstr) ['123123', '123123']
最新回复(0)