01-基本符号
1.什么是正则
正则表达式就是一个字符匹配的工具;
是由正则符号和普通字符组成,来匹配不同规律的字符
2.Python队正则表达式的支持
Python中提供了一个re模块,用来支持正则表达式
fullmatch(正则表达式,字符串)-用正则表达式去匹配字符串,如果匹配成功返回匹配结果,失败返回none
Python中正则表达式的写法:将正则内容写在字符串中,一般在这个字符串前面加r/R
import re
1普通字符
普通字符在表达式中代表字符本身
re_str = r'abc'
result = re.fullmatch(re_str,'abc')
print(result)
2 .- 匹配任意字符
在正则表达式中, .出现的位置,可以匹配一个任意字符
注意:一个点只能匹配一个字符
p匹配长度为三的字符串,中间是任意字符
re_str = r'a.c'
result = re.fullmatch(re_str,'a#c')
print(result)
3 \w-匹配字母数字下划线
在正则表达式中,\w出现的位置,可以匹配一个任意字母数字或者下划线(其实也可以匹配Unicode编码中除了阿斯科码剩下的部分)
注意:
一个\w只能匹配一个字符
中文也可以匹配
re_str = r'\wab.'
result = re.fullmatch(re_str,'5abe')
print(result)
4 \s - 匹配空白字符
包括:空格、缩进、制表符和换行符(\r ,\t,\n,空格)
re_str = r'\w\w\s\s..'
result = re.fullmatch(re_str,'sf\n\ten')
print(result)
5 \d - 匹配数字字符
re_str = r'\d\d\d..'
result = re.fullmatch(re_str,'644du')
print(result)
\b - 检测单词边界
注意:\b 是检测其出现的位置是否是单词边界,不会对字符进行匹配。
当正则表达式中出现了\b,匹配的时候去掉\b,匹配成功后再看其出现的位置是否是单词边界
单词边界:单词开头,单词结尾、标点符号、空白符号(只有能将单词区分开的符号都属于单词边界)
匹配字符串'hello,world',并且要求w 前面是单词边界,h前面也是单词边界
re_str = r'\bhello,\bworld'
result = re.fullmatch(re_str,' hello,wolrd')
7 ^ - 检测字符串开头
在match和fullmatch中没有意义,search、findall等中有意义
re_str = r'^the'
result = re.fullmatch(re_str,'the')
8 $ -检测字符串结尾
在match和fullmatch中没有意义,search、findall等中有意义
re_str = r'the$'
result = re.fullmatch(re_str,'the56')
9 \大写字母 - 对应的功能是\小写字母的功能取反
\W \D \S \B
字符集
1.普通字符集
列如:【abc】- 匹配一个字符是a或b或c
注意:一个中括号只能匹配一个字符
正则中有特殊功能的单个符号,在中括号中表示其本身(.$^+*|)
匹配字符的组合 符号在中括号中保持原有功能\w \b \d \s \W \D \S \B
re_str = r'\d[abcd]'
result = re.fullmatch(re_str,'8d')
print(result)
2.[字符1-字符2]-表示字符1 到字符2(要求:字符1的编码制要小于字符2)
[a-z] - 匹配所有小写字母
[A-Z] - 匹配所有大写字母
[a-zA-Z] - 匹配所有字母
[1-7] - 数字字符1到7
[\u4e00-\u9fa5] - 匹配所有中文
re_str = r'[a-z]'
11 [^字符集]-匹配不在字符集中的任意一个
[^abc]-匹配除了abc以外的任意一个字符
[^\d]-匹配除了数字字符以外的任意一个字符
[^a-z]-匹配除了小写字母以外的任意一个字符
re_str = r'[^abc]'
result = re.fullmatch(re_str,'f')
print(result)
02-正则控制匹配次数
import re
1* - 匹配0次或者多次
a* - a出现0次或多次,'','a','aaa'...都可以匹配
\d* - 任意数字出现0次或多次'','1''23'...都可以
[abc]* - a或b或c
[a-z]* -
注意:在[]外面的*前面需要一个字符或一个匹配字符的符号
print(re.fullmatch(r'a*b','aaab'))
print(re.fullmatch(r'[a-z]*''sdwefrefefw'))
+ 匹配一次或多次
a+ a至少出现一次
\d+ 数字至少出现一次
3.? 匹配0次或一次
a? a出现0次或一次
匹配一个整数
re_str = r'[+-]?[1-9]\d*'
4{}
{N} - 匹配n次,a{3}:匹配3个a
{M,N}-匹配M-n次 a{3,5} - 三个或四个或五个a
{,N} - 最多N次(0-n)
{m,}-至少m次
密码:字母和数字组成,数字不开头,6-12位
re_str = r'[A-Za-z][\dA-Za-z]{5-11}'
03-分支、捕获和贪婪
import re
1.分支
条件1 | 条件2 - 匹配条件1或条件2
\d{2} | [a-z] - 两个数字字符或者一个小写字母
a\d{2} | \w{2} - a后两个数字或者两个数字字母下划线
注意:正则中的分支也会出现短路,当条件1可以匹配,就不会在使用条件2匹配
匹配所有的数,包括正负小数和零
re_str = r'[+-]?[1-9]\d*[.]?\d*|[+-]?0[.]\d+|0'
print(re.fullmatch(re_str,'2'))
2 () - 捕获和分组
分组 - 将括号中的类容作为一个整体
'abc123'
'abcAJS'
re_str = r'abc(\d{3}|[A-Z]{3})'
RE = r'(\d[a-z]){3}'#数字小写字母出现三次
捕获
通过正则获取符合条件的字串的时候,可以在正则表达式中加括号,匹配后取值只取括号中内容
re.findall(正则表达式,字符串) - 在字符串中找所有符合正则表达式的结果,返回列表
取值只取括号中内容
重复匹配
带多个分组的正则表达式可以在分组后面通过添加\数字来重复前面第几个分组中匹配的内容
说明:\数字 - 代表前面第几个分组;\1代表第一个分组
re_str = r'\d{3}([a-z]{2})a\1'
print(re.fullmatch(re_str,'235heahe'))
3.贪婪
匹配次数后加?就是贪婪匹配:*? +? ?? {m,n}? -表示尽可能少的重复
4.转义符号
\w + * ? ( ) [^ -]
在正则表达式中偶特殊意义或特殊功能的符号前加\来取消其特殊意义
\w - 代表两个字符,分别是\ 和w
+ 代表+字符
* 代表*字符
04-re模块
import re
1.compile
compile(正则表达式) - 将正则表达式转换成正则表达式对象
转换成对象后可以通过对象调用对象方法
re_str = '\d{3}'
2.macth/fullmacth
fullmatch(正则表达式,字符串)-完全匹配,从开头到结尾
match(正则表达式,字符串)-不完全匹配,只匹配开头
匹配成功返回匹配对象,失败返回none
匹配对象
1.获取span - 匹配到的内容的范围,(开始下标,结束下标),结束下标取不到
匹配对象.span()-获取整个正则表达式匹配的范围
匹配对象.span(n)-获取整个正则表达式第n个分组匹配到的范围
2.start和end - 获取匹配结果的开始下标和结束下标
匹配对象.start()/匹配对象.end() - 获取匹配结果的开始下标和结束下标
匹配对象.start(n)/匹配对象.end(n)-获取整个正则表达式第n个分组匹配到的开始下标和结束下标
3.group - 获取匹配到的内容
匹配对象.group()-获取整个正则表达式匹配的内容
匹配对象.group(n)-获取整个正则表达式第n个分组匹配到的内容
4.string - 获取用来匹配的原字符串
匹配对象.string
3.search
search(正则表达式,字符串)-匹配字符串中第一个满足正则表达式的字串,匹配成功返回匹配对象,不成功返回none
有多个只匹配第一个
4.split
split(正则表达式,字符串)-在字符串中按照满足正则表达式的字串对字符串进行切割
返回值是个列表
5.sub
sub(正则表达式,新字串,字符串)-用新串替换字串,返回一个替换后的字符串
6.findall
findall(正则表达式,字符串)-在字符串中获取满足正则表达式的所有字符,返回一个列表,元素是字符串
注意:如果正则表达式中有一个分组,结果是表达式中那个分组匹配到的结果
如果表达式中分组个数大于1,结果是一个列表,元素是元组,元组中内容是匹配到的内容
6.finditer
finditer(表达式,字符串)- 获取字符串中表达式的内容,返回一个迭代器,元素是匹配对象