day-17正则表达式
正则表达式: 解决字符串问题的工具(让复杂的字符串问题变得简单的一个工具)
1-匹配字符串
-
re模块
re模块是python用来支持正则表达式的一个模块
re模块中提供了各种和正则相关的函数:fullmatch、search、findall、match、split、sub等等
fullmatch(正则表达式, 字符串) – 判断整个字符串是否完全符号正则表达式描述的规则。如果不符合返回值是None
python中提供正则表达式的方式:r’正则表达式’
js中提供正则表达式的方式:/正则表达式
-
匹配类符号 – 一个正则符号表示一类字符
匹配类符号在正则中的作用:用来要求字符串中某个位置必须是什么样的字符
1)普通符号 – 在正则表达式中表示这个符号本身,对应字符串中的字符的要求就是符号本身。
6)\大写字母 – 与相应的小写字母的功能相反
\D – 匹配任意一个非数字字符
\S – 匹配任意一个非空白字符
\W
-
[字符集] – 匹配字符集中任意一个字符
注意:一个[]只能匹配一个字符
[多个普通符号] – 例如:[abc12], 在’a’、‘b’、‘c’、‘1’、’2’五个符号中任意一个可以匹配
[包含\开头的特殊符号] – 例如:[mn\d]、[m\dn]、[\dmn], 要求是m或者n或者任意一个数字
[字符1-字符2] – 例如:[a-z],要求是任意一个小写字母
[a-zA-Z],要求是任意一个字母
[2-9a-z],要求是2到9或者是任意一个小写字母
[\u4e00-\u9fa5],要求是任意一个中文
[\u4e00-\u9fa5\dabc]
注意:[]中如果-不在两个字符之间,就不能表示谁到谁,那它就是个普通符号
- 【^字符集】匹配不在字符集中的任意一个字符
2-匹配次数
#1. * – 匹配0次或者多次(任意次数)
a* – a出现任意次数
\d* – 任意多个\d -> 任意多个数字
[abc]* – 任意多个[abc] -> 任意多个(a或者b或者c)
-
-
- 匹配1次或者多次(至少1次
-
-
? – 0次或1次
-
{}
{N} – N次
{M,N} – M到N次
{M,} – 至少M次
{,N} – 最多N次 -
贪婪和非贪婪
在匹配次数不确定的时候,匹配模式分为贪婪和非贪婪两种,默认是贪婪的。
匹配次数不确定:*、+、?、{M,N}、{M,}、{,N}
贪婪和非贪婪:在次数不确定的情况下,对应的字符串在不同次数下有多种匹配结果,贪婪取最多次数对应的结果。(前提是匹配成功有多种情况)
非贪婪取最少次数对应的结果。
贪婪:
、+、?、{M,N}、{M,}、{,N}
非贪婪:
?、+?、??、{M,N}?、{M,}?、{,N}?
3-分组与模块
1 分组 ()
从左到右数小括号开始位置就是该分组是第几个分组
分子就是在正则表达式中用括号将正则中的部分内容括起来就形成了一个分组
1)整体操作
2) 重复
3) 捕获(匹配时仍以正则表达式匹配,获取匹配到的结果的部分内容)
在正则中 \n 可以重复 \n 所在位置的前面的第 n 个分组所匹配的内容
4-检测符号与转义符号
3 \b 检测是否是单词边界 \B检测是否非单词边界
单词边界: 凡是可以用来将两个单词区分开来的符号,例如:空白字符 标点符号 字符串开头 字符串结尾
4 ^ 检测是否是字符串开头 前提:字不在【】里面
5 $ 检测是否是字符串结尾
2 转义符号
正则的转义符号是指在本身就具备特殊功能的符号前加 \ 让它本身具备的特殊功能消失变成一个普通字符
注意:独立存在有特殊意义的符号,放在 [] 中特殊功能会消失变成一个普通字符
5-re常用函数
#1 re.fullmatch(正则表达式,字符)
#用整个字符串和和正则表达式匹配,匹配成功就返回匹配对象,匹配失败返回空值
2 re.match(正则,字符串)
匹配字符串开头,匹配成功就返回匹配对象,匹配失败返回空值
3 re.search(正则,字符串)
#匹配字符串第一个瞒住正则表达式的字符串,匹配成功就返回匹配对象,匹配失败返回空值
4 热.findall(正则,字符串)
获取字符串中所有能满足正则的子串,返回值是列表,列表中的元素是匹配的字符串
5 re.finditer(正则,字符串)
#获取字符串中所有能满足正则的子串,返回值是迭代器,迭代器中的元素是匹配的字符串(对象)
6 re.split(正则,字符串)
将字符串中所有满足正则的字符串作为切割点惊醒切割,返回值是一个列表,列表中的元素是字符串
7 re.sub(正则,字符串1,字符串2)
将字符串2中所有满足正则的字符子串用字符串1代替
6-参数
匹配对象
1) 获取匹配结果对应的字符串
a 获取整个正则表达式匹配到的字符串
#b 获取某个分支匹配到的结果 ——匹配对象.group(n)
2 获取某个分组匹配到的结果在原字符串中的位置信息
#匹配对象.span(n)
3 参数
1)单行匹配和多行匹配
’
多行匹配时 . 不可以和 \n 进行匹配 (默认) flags=re.M 或(?M)
单行匹配时 . 可以和 \n 进行匹配 flags=re.S 或(?S)
2)忽略大小写
’
默认情况下大小写字母是不一样的,忽略大小写后大写字母就可以和对应的小写字母匹配
方法:flags=re.I
在正则最前面写 (?i)
’
3即忽略大小写又要单行匹配
’
方法:flags=re.I|re.S
一、不定项选择题
-
能够完全匹配字符串”(010)-62661617″和字符串”01062661617″的正则表达式包括(A B D )
A.
r"\(?\d{3}\)?-?\d{8}"
B.
r"[0-9()-]+"
C.
r"[0-9(-)]*\d*"
D.
r"[(]?\d*[)-]*\d*"
-
能够完全匹配字符串”back”和”back-end”的正则表达式包括(A B C D )
A.
r'\w{4}-\w{3}|\w{4}'
B.
r'\w{4}|\w{4}-\w{3}'
C.
r'\S+-\S+|\S+'
D.
r'\w*\b-\b\w*|\w*'
-
能够完全匹配字符串”go go”和”kitty kitty”,但不能完全匹配“go kitty”的正则表达式包括(A D)
A.
r '\b(\w+)\b\s+\1\b'
B.
r'\w{2,5}\s*\1'
C.
r'(\S+) \s+\1'
D.
r'(\S{2,5})\s{1,}\1'
-
能够在字符串中匹配”aab”,而不能匹配”aaab”和”aaaab”的正则表达式包括(B C )
A.
r"a*?b"
B.
r"a{,2}b"
C.
r"aa??b"
D.
r"aaa??b"
二、编程题
1.用户名匹配
要求: 1.用户名只能包含数字 字母 下划线
2.不能以数字开头
3.⻓度在 6 到 16 位范围内
t1=re.fullmatch(r'\D[_a-zA-Z\d]{5,15}',"gyhu7yh")
- 密码匹配
要求: 1.不能包含!@#¥%^&*这些特殊符号
2.必须以字母开头
3.⻓度在 6 到 12 位范围内
t1=re.fullmatch(r'[a-zA-Z][^!@#¥%^&*]{5,11}',"gyu7yffh")
-
ipv4 格式的 ip 地址匹配
提示: IP地址的范围是 0.0.0.0 – 255.255.255.255
t1=re.fullmatch(r'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',"255.255.255.255")
- 提取用户输入数据中的数值 (数值包括正负数 还包括整数和小数在内) 并求和
例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
t1=re.findall(r'[-]?\d+[.]?\d+','-3.14good87nice19bye')
print(t1)
t2='+'.join(t1)
print(eval(t2))
-
验证输入内容只能是汉字
t1=re.findall(r'[\u4e00-\u9fa5]+','-3.14good87nice19bye') print(t1)
-
匹配整数或者小数(包括正数和负数)
t1=re.fullmatch(r'[-]?\d+[.]?\d+','-3.14')
-
验证输入用户名和QQ号是否有效并给出对应的提示信息
要求:
用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
QQ号是5~12的数字且首位不能为0def s(user,qq_tel): result=re.fullmatch(r'[\d_a-zA-Z]{6,20}',user) if not result: print('用户名输入有误!') return 0 result1=re.fullmatch(r'[1-9][0-9]{4,11}',qq_tel) if not result1: print('qq号呼入有误') return 1 user=input('请输入用户名:') qq_tel=input('请输入qq号:') s(user,qq_tel)
-
拆分长字符串:将一首诗的中的每一句话分别取出来
poem = ‘窗前明月光,疑是地上霜。举头望明月,低头思故乡。’
poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
s=re.split(r'[,。]',poem)
print(s)