1)----------匹配单个字符与数字------
. -->匹配除换行符以外的任意字符
[] -->[]是字符集合,表示匹配[]中所包含的任意一个字符
[a-z] -->匹配任意小写字母
[A-Z] -->匹配任意大写字母
[0-9] -->匹配任意数字,和[0123456789]效果一样
[0-9a-zA-Z] -->匹配任意的数字和字母
[0-9a-zA-Z_] -->匹配任意的数字、字母和下划线
[^sun] -->匹配除了sun这三个字符之外的所有字符
^称为脱字符,表示不匹配集合中的字符 -->英文输入模式下,按Shite + 6
\d -->匹配数字,和[0123456789]、[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模式下,也不会匹配其它行的行尾
\b -->匹配一个单词(\b的位置就是单词结束的位置)
\B -->匹配非单词边界
3)----------匹配多个字符------
说明:下方的x,y,z均为假设的普通字符,不具有特殊一样
(xyz) -->匹配小括号内的xyz(作为一个整体)
x? -->匹配0个或者一个x 非贪婪匹配(尽可能少的匹配)
x* -->匹配0个或者任意多个x 贪婪匹配(尽可能多的匹配)
x+ -->匹配至少一个x
x{n} -->匹配确定的n个x(n事一个非负整数)
x{n,} -->匹配至少n个x(n事一个非负整数)
x{n,m} n <= 匹配个数 <=m (匹配n个到m个x)
x|y -->表示或,匹配的是x或y
4)----------特殊------
*? +? x? 最小匹配 通常都是尽可能多的匹配,可以使用这种解决贪婪匹配
对于str = "start part1 stop start part2 stop start part3 stop"
如果用r"start.*stop",则是贪婪匹配 .*尽可能匹配的长一些,匹配结果就是最长的一串
['start part1 stop start part2 stop start part3 stop']
而如果用r"start.*?stop",则是贪婪匹配 .*?尽可能匹配的短一些,匹配结果就是所有的短串
['start part1 stop', 'start part2 stop', 'start part3 stop']
5)匹配的内容中包含有正则表达式的元字符怎么办?
如 str = "2*3=6",想要匹配2*,以及其位置spen,使用r"2*"是不行的
使用\*将*作为普通字符,不作为正则表达式的元字符,r"2\*"
#手机号码匹配:r"^1(([3578]\d)|(47))\d{8}$"
#如果是在字符串中查询,则r"1(([3578]\d)|(47))\d{8}",去掉首尾限制
lstr = ["1321234567","13212345678","132123456780","1321234567a",
"23212345678","14712345678"]
for ss in lstr:
print(re.search(r"^1(([3578]\d)|(47))\d{8}$",ss))
#demo1 练习使用.
# 匹配.n
print(re.search(".n","the sun is shine")) #匹配到第一个符合的字符串"un"
#demo2 练习使用[]
#找到一个字符串中的所有数字
listNum = re.findall("[1234567890]","t1od3ay is goo4d t1y5i2")
print(listNum)
#demo 练习使用行首匹配^
print(re.search("^sun","the sun is shine"))#不能匹配到,因为sun不在行首
print(re.search("^sun","sun,the sun is shine"))#能匹配到,因为sun在行首
#demo 练习使用\A 前面加'r',以防其中包含转义字符
print(re.findall("^the","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))
print(re.findall(r"\Athe","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))
#demo 练习使用\b 前面加'r',以防其中包含转义字符
#能找到前三个sun,他们以' '及','为边界结尾,sune也包含了sun,但不能找到
print(re.findall(r"sun\b","sun the sun is sun,sune"))
#demo 练习使用\B 前面加'r',以防其中包含转义字符
#只找到一个sun
print(re.findall(r"sun\B","sun the sun is sun,sune"))
#改用search函数,发现spen =(19,22),就是sune的位置
print(re.search(r"sun\B","sun the sun is sun,sune"))
#demo
print(re.findall(r"s+","sun the ssn is sss,sune"))
#demo
print(re.findall(r"s{3}","sun the ssn is sss,sune"))
#demo
print(re.findall(r"s{2,}","sun the ssn is sss,sune"))
#demo
print(re.findall(r"s{1,2}","sun the ssn is sss,sune"))
#demo
print(re.findall(r"((s|S)un)","sun the ssn is sss,Sune"))
# 提取 sun...day
str = "sun the ssn is sss,Sune,today"
print(re.findall(r"^sun.*day$",str))
str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*stop",str2))
str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*?stop",str2))
str3 = "2*3=6"
print(re.search(r"2*",str3)) #只能找到2,而不能找到2*
print(re.search(r"2\*",str3)) #\*将*作为普通字符,不作为正则表达式的元字符