简述
正则表达式又称规则表达式,是一种描述字符串匹配的模式。重点:正则匹配是一个模糊的匹配,并不是精确的匹配。
1.正则表达式——匹配单个字符与数字
匹配 | 说明 |
. | 匹配除换行符以外的任意字符,当flags被设置为re.S时,可以匹配包含换行符以内的所有字符 |
[ ] | 里面是字符集合,匹配[]里任意一个字符 |
[0123456789] | 匹配任意一个数字字符 |
[0-9] | 匹配任意一个数字字符 |
[a-z] | 匹配任意一个小写英文字母字符 |
[A-Z] | 匹配任意一个大写英文字母字符 |
[A-Za-z] | 匹配任意一个英文字母字符 |
[A-Za-z0-9] | 匹配任意一个数字或英文字母字符 |
[^lucky] | [ ]里的^称为脱字符,表示非,匹配不在[ ]内的任意一个字符 |
^[lucky] | 以[ ]中内的某一个字符作为开头 |
\d | 匹配任意一个数字字符,相当于[0-9] |
\D | 匹配任意一个非数字字符,相当于`[^0-9]` |
\w | 匹配字母、下划线、数字中的任意一个字符,相当于[0-9A-Za-z_] |
\W | 匹配非字母、下划线、数字中的任意一个字符,相当于`[^0-9A-Za-z_] |
\s | 匹配空白符(空格、换页、换行、回车、制表),相当于[ \f\n\r\t] |
\S | 匹配非空白符(空格、换页、换行、回车、制表),相当于[^ \f\n\r\t] |
2.匹配锚字符
锚字符:用来判定是否按照规定开始或者结尾
匹配 | 说明 |
^ | 行首匹配,和[ ]里的^不是一个意思 |
$ | 行尾匹配 |
\A | 匹配字符串的开始,和^的区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配其他行的行首 |
\Z | 匹配字符串的结尾,和$的区别是\Z只匹配整个字符串的结尾,即使在re.M模式下也不会匹配其他行的行尾 |
3.限定符
匹配 | 说明 |
(xyz) | 匹配括号内的xyz,作为一个整体去匹配 一个单元 子存储 |
x? | 匹配0个或者1个x,非贪婪匹配 |
x* | 匹配0个或任意多个x |
x+ | 匹配至少一个x |
x{n} | 确定匹配n个x,n是非负数 |
x{n,} | 至少匹配n个x |
x{n,m} | 匹配至少n个最多m个x |
x\|y | \|表示或的意思,匹配x或y |
补充:贪婪和非贪婪模式
贪婪模式:匹配尽可能多的字符
.+ 匹配换行符以外的字符至少一次
.* 匹配换行符以外的字符任意次
非贪婪模式:尽可能少的匹配
.+? 匹配换行符以外的字符至少一次
.*? 匹配换行符以外的字符任意次
re模块中常用的四个方法:
- match()
- search()
- findall()
- finditer()
match()函数
原型:
def match(pattern, string, flags=0)
参数的含义:
- pattern 匹配的正则表达式(一种字符串的模式)
- string 要匹配的字符串
- flags 标识位,用于控制正则表达式的匹配方式
功能:匹配成功返回匹配的对象 ,匹配失败返回 None
获取匹配结果: 使用group()方法 获取到匹配的值
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
注意:从第一位开始匹配,只匹配一次
示例:
import re
res = re.match('\d{6}','12356656') #\d 匹配任意一个数字字符,相当于[0-9]
print(res.group())
print(res.span()) #span()函数是用于字符串中搜索模式并返回匹配的起始和结束位置
search()函数
原型
def search(pattern, string, flags=0)
参数的含义:
- pattern 匹配的正则表达式(一种字符串的模式)
- string 要匹配的字符串
- flags 标识位,用于控制正则表达式的匹配方式
功能:
扫描整个字符串string,并返回第一个pattern模式成功的匹配
匹配失败 返回 None
注意:
只要字符串包含就可以,只匹配一次
示例:
import re
res = re.search('[a-z]', '131A3ab889s')
print(res)
print(res.group())
match()与search()的区别:
相同点:都只匹配一次
不同点:
search是在要匹配的字符串中 包含正则表达式的内容就可以
match 必须第一位就开始匹配 否则匹配失败
findall()函数(返回列表)
原型:
def findall(pattern, string, flags=0)
参数的含义:
- pattern 匹配的正则表达式(一种字符串的模式)
- string 要匹配的字符串
- flags 标识位,用于控制正则表达式的匹配方式
功能:
扫描整个字符串string,并返回所有匹配的pattern模式结果的字符串列表
finditer()函数
原型:
def finditer(pattern, string, flags=0)
参数的含义:
- pattern 匹配的正则表达式(一种字符串的模式)
- string 要匹配的字符串
- flags 标识位,用于控制正则表达式的匹配方式
功能:
与findall()类似,返回一个迭代器
修正符
re.I | 不区分大小写匹配 |
re.M | 多行匹配 影响到^ 和 $ 的功能 |
re.S | 使.可以匹配换行符 匹配任意字符 |
功能:
对正则进行修正
使用:
search/match/findall/sub/subn/finditer 等函数 flags参数的使用
re.I例子:
import re
print(re.findall('[a-z]','AaBb'))
print(re.findall('[a-z]','AaBb', flags=re.I))
re.M例子:
import re
myStr = """asadasdd1
bsadasdd2
csadasdd3"""
print(re.findall('^[a-z]',myStr, ))
print(re.findall('\A[a-z]',myStr))
print(re.findall('\d$',myStr))
print(re.findall('\d\Z',myStr))
# re.M
print('+++++++++++++++++++++分割线++++++++++++++++++++++++')
print(re.findall('^[a-z]',myStr, flags=re.M))
print(re.findall('\A[a-z]',myStr, flags=re.M))
print(re.findall('\d$',myStr, flags=re.M))
print(re.findall('\d\Z',myStr, flags=re.M))
re.S例子:
import re
print(re.findall('<b>.*?</b>','<b>b标签</b>'))
print(re.findall('<b>.*?</b>','<b>b标\n签</b>', flags=re.S))
补充:
split()函数
原型:
def split(patter, string, maxsplit=0, flags=0)
参数作用:
pattern 正则表达式
string 要拆分的字符串
maxsplit 最大拆分次数 默认拆分全部
flags 修正符
作用:切割字符串
例子:
import re
myStr = "asdas\rd&a\ts12d\n*a3sd@a_1sd"
#通过特殊字符 对其进行拆分 成列表
res = re.split("[^a-z]",myStr)
res = re.split("\W",myStr)
print(res)