正则表达式定义
普通字符和元字符构成的字符串,描述一类字符串规则
元字符
- 有特殊含义的字符
表达式 匹配 .
小数点可以匹配除了换行符 \n
以外的任意一个字符|
逻辑或操作符 ,或 []
匹配字符集中的一个字符 [^]
对字符集求反,也就是上面的反操作。尖号必须在方括号里的最前面 -
定义 []
里的一个字符区间,例如[a-z]
\
对紧跟其后的一个字符进行转义 ()
对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值
- 记得要导包, import re
例如
import re
a = re.findall("a.c","abcdefg")
print(a) #['abc']
#匹配a或者c
a = re.findall("a|c","abdefgc")
print(a) #['a', 'c']
#匹配列表中的任意任意一个字符
a = re.findall("[acbe]","abdefgc")
print(a) #['a', 'b', 'e', 'c']
#除了a和c其余都要
a = re.findall("[^ac]","adfgcvs")
print(a) #['d', 'f', 'g', 'v', 's']
#a-c 意思是匹配abc三个字符
a = re.findall("[a-c]","adfgcvs")
print(a) #['a', 'c']
#意思是把adf作为一个整体进行输出
a = re.findall("(adf)","adfgcvs")
print(a) #['adf']
#去掉小数点的特殊含义,他就是一个小数点
a = re.findall("\.","adf.gcvs")
print(a) #['.']
转义字符
表达式 匹配 \r
,\n
匹配回车和换行符 \t
匹配制表符 \\
匹配斜杠 \
\^
匹配 ^
符号\$
匹配 $
符号\.
匹配小数点 .
预定义匹配字符集
表达式 匹配 \d
任意一个数字,0~9中的任意一个 \w
任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个 \s
空格、制表符、换页符等空白字符的其中任意一个 \D
\d
的反集,也就是非数字的任意一个字符,等同于[^\d]
\W
\w
的反集,也就是[^\w]
\S
\s
的反集,也就是[^\s]
例如
#匹配出0-9的数字
a = re.findall("\d","abc1e34r")
print(a) #['1', '3', '4']
# `\d`的反集,也就是非数字的任意一个字符,等同于`[^\d],除数字以外的
a = re.findall("\D","abc 123")
print(a) #['a', 'b', 'c', ' ']
# 任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个
a = re.findall("\w","abwc1e34r_")
print(a) #['a', 'b', 'w', 'c', '1', 'e', '3', '4', 'r', '_']
#`\w`的反集,也就是`[^\w]` ,除字母以外的
a = re.findall("\W","abwc1 e34r_")
print(a) #[' ']
#都可以匹配下划线了,那空格怎么匹配
a = re.findall("\s","abc 123")
print(a) #[' ']
# `\s`的反集,也就是`[^\s]`,除空格以外
a = re.findall("\S","abc 123")
print(a) #['a', 'b', 'c', '1', '2', '3']
重复匹配
表达式 匹配 {n}
表达式重复n次,比如 \d{2}
相当于\d\d
,a{3}
相当于aaa
{m,n}
表达式至少重复m次,最多重复n次。比如 ab{1,3}
可以匹配ab
或abb
或abbb
{m,}
表达式至少重复m次,比如 \w\d{2,}
可以匹配a12
,_1111
,M123
等等?
匹配表达式0次或者1次,相当于 {0,1}
,比如a[cd]?
可以匹配a
,ac
,ad
+
表达式至少出现1次,相当于 {1,}
,比如a+b
可以匹配ab
,aab
,aaab
等等*
表达式出现0次到任意次,相当于 {0,}
,比如\^*b
可以匹配b
,^^^b
等等
例如
import re
#意思是ll要有两个
a = re.findall("l{2}","yesall")
print(a)
#意思是l要有2个到4个
a = re.findall("l{2,4}","alyesallnoalllowallll")
print(a) #['ll', 'lll', 'llll']
#意思是l最少要有两个,上不封顶
a = re.findall("l{2,}","alyesallnoallll")
print(a) #['ll', 'llll']
#意思是l至少有一个
a = re.findall("l+","yellowlow")
print(a) #['ll', 'l']
#意思是l至少有0个
a = re.findall("l*","yellowlow")
print(a) #['', '', 'll', '', '', 'l', '', '', '']
位置匹配
表达式 匹配 ^
在字符串开始的地方匹配,符号本身不匹配任何字符 $
在字符串结束的地方匹配,符号本身不匹配任何字符 \b
匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符 \B
匹配非单词边界,即左右两边都是 \w
范围或者左右两边都不是\w
范围时的字符缝隙
例如
#位置匹配
#^ 以什么开头
a = re.findall("^185","1853999999")
print(a) #['185']
# $ 以什么结尾
b = re.findall("w$","yellow")
print(b) #['w']
贪婪模式与非贪婪模式
“贪婪模式”总是尝试匹配尽可能多的字符;“非贪婪模式”则相反,总是匹配尽可能少的字符
练习
1.长度为8-10的用户密码(以字母开头、数字、下划线)
2.电子邮箱验证
3.电话号码的验证
答:
# 1.长度为8-10的用户密码(以字母开头、数字、下划线)
import re
#输入一个密码,验证长度为8-10的用户密码(以字母开头、数字、下划线)
s = input("请输入一个密码:")
a= re.findall("^[a-zA-Z]\w{7,9}",s) #从0开始
print(a)
#2.电子邮箱验证
s = input("请输入一个电子邮箱:")
a= re.findall("^\w+@\w+[\.]\w+$",s) #从0开始
print(a) #newglf@163.com
#3.电话号码的验证
s = input("请输入一个电话:")
zengze = "^1[3,4,8,]\d{9}$"
^1[3-9]\d{9}
a= re.findall(zengze,s) #从0开始
print(a)
#联通电话
#130、131、132、145、155、156、166、167、171、175、176、185、186、196
s = input("请输入一个电子邮箱:")
zengze = "^(13[0,1,2]|14[5]|15[5,6]|16[6,7]|17[1,5,6]|18[5,6]|19[6])\d{8}$"
a= re.search(zengze,s)
print(a)