第七章 模式匹配与正则表达式
1.正则表达式匹配
(1)import re 导入模块
(2)re.compile() 创建一个Regex对象(匹配格式)(rule=re.compile(r’\d\d’))
(3)search()传入想要查找的文本(x=rule.search(‘my lucky num is 25’))
(4)gounp()返回实际匹配格式的文本的字符串(x.gound()=25)
ps. r’'可以标记为原始字符串,但其中的有些字符(?、.、*、+)使用原始格式时要加反斜杠(\)
2.正则表达式匹配的其他模式
形式 | 作用 |
---|---|
括号(()) | 拆分目标文本 |
管道(|) | 使用匹配多个格式,|左右的格式都可以 |
问号(()?) | 括号内的的格式可有可没有(出现0次或1次) |
星号(()* ) | 括号内的格式出现0次或多次 |
加号(()+) | 括号内的格式出现1次或多次 |
花括号((){a,b} ) | 括号内的格式出现a至b次(可以单指x次) |
问号2( {a,b}?) | 不贪心匹配:当文本出现的次数在ab范围内时,只匹配最小个数;不加问号默认为贪心匹配(匹配最多个数) |
ps.括号只是为了解释更清楚,有些地方可以省略
3.finfall()函数
search()函数只返回第一个查找到符合格式的Match对象(x的值只有一个),但findall()函数将返回匹配格式的所有Match对象,所有Match对象作为一个列表返回;如果rule进行了分组,那么列表的每个元素将以元组的形式来表示各分组。
4.sub()函数
在Regex对象上调用,有两个参数,第一个是要代替Regex对象的文本,第二个是原始文本(被查找的文本)。
5.字符分类
基本字符:
符号 | 含义 |
---|---|
\d | 数字 |
\w | 单词——字母、数字、下划线 |
\s | 空白字符——空格、制表符、换行符 |
\D | 非\d |
\W | 非\w |
\S | 非\s |
. | 任意字符(除换行符以外) |
自定义分组:
符号 | 含义 |
---|---|
[abcdA] | 匹配所有a、b、c、d、A字符 |
[a-zA-Z] | 匹配所有大写小写字母 |
[\.\?\*\(\)] | 匹配所有.、?、*、()字符——倒斜杠转义字符 |
.* | 匹配所有字符(除换行符以外) |
.{5} | 匹配5个字符(除换行符以外) |
6.特殊符号
插入符号(^):在正则表达式开始时使用,表示匹配格式必须在被查找文本的开始处。
美元符号($):在正则表达式结尾时使用,表示匹配格式必须在被查找文本的结尾处。
7.compile()函数的特殊参数
complie()函数的第二参数有三个特殊的值:
参数值 | 作用 |
---|---|
re.IGNORECAST( re.I) | 不区分Regex对象中正则表达式的大小写 |
re.DOTALL | 使(.)可以匹配所有字符,包括换行符 |
re.VERBOSE | 忽略 Regex对象中正则表达式中的空白符和注释——用于复杂的表达式解释 |
8.实践项目
(1)强口令检查(密码不能太简单):长度不少于8个字符、包含大小写字符、至少一个数字。
import re
def check(text):
if len(text)<8:
print('口令不能少于八个字符')
elif re.compile(r'[a-z]').search(text)==None:
print('口令必须同时包含大小写字符')
elif re.compile(r'[A-Z]').search(text)==None:
print('口令必须同时包含大小写字符')
elif re.compile(r'\d+').search(text)==None:
print('口令至少要有一位数字')
else :
print('口令通过')
while True:
print('请输入一个口令')
text =input()
check(text)
(2)strip()函数的正则表达式版本:第一个参数接受一个字符串,第二个参数指定所要删除的字符,默认去除首尾空白字符。
import re
def strip_xiao(text,remove_text):
if remove_text == '':
newtext = re.compile(r'^\s* | \s*$').sub('',text)
else:
newtext = re.compile(r'^['+remove_text+']*|['+remove_text+']*$').sub('',text)
return newtext
while True: #验证板块
print('请输入一个字符串')
x1 =input()
x2 =input()
print(strip_xiao(x1,x2))