目录
15.1 re正则表达式
正则表达式:普通字符和元字符构成的字符串,描述一类字符串规则
match() 从左往右匹配,匹配了就返回结果,如果匹配不上就会None
findall() 匹配上的都会放到列表里面去
15.1.1 元字符
正则表达式:习惯性在字符串前面加r,变成原始字符串
元字符: 匹配单个字符
. 表示任意一个字符,但是除了\n
\d 表示0-9之间任意一个数字
\D 表示 非数字
\s 表示 空白 \n \t
\S 表示 非空白
\w 表示 英文字母,数字,下划线
\W 和\w相反
# [\d\D] 数字 或者 非数字 =》 任意字符
字符集:同样只能匹配单个字符,使用中括号来表示,表示一个字符范围
import re
# \d 0~9
print(re.match('[0123456789]', 'zc')) # 属于0123456789 都复合
print(re.match('[A-z]', 'zZ')) # 全体字母
print(re.match('[0-9]', '3A')) # 匹配 0-9范围内的数字
print(re.match('[^a-e]', 'f')) # 匹配a-e以外的字符串
15.1.2 数量规则
数量符号
* 匹配前一个字符的任意次数,包括0次
+ 匹配前一个字符重复匹配1次以上的 >=1
t = ''
res = re.match('\w*',t)
print(res)
res = re.match('\w+',t) #
print(res)
? 匹配前一个字符出现0次或者1次
{m} 匹配前一个字符的m次数
{m,} 至少匹配m次数以上
{m,n} 至少匹配m次以上, n次以下
t = '18528322390'
res = re.match('\d*',t)
print(res)
res = re.match('\d+',t) # 贪婪模式
print(res)
res = re.match('\d?',t) # 贪婪模式
print(res)
res = re.match('\d{3,6}',t)
"""
\d\d\d
\d\d\d\d
\d\d\d\d\d
\d\d\d\d\d\d
"""
15.1.3 边界处理
边界就是开始和结尾
^ 开始 ps: 注意这个不是表示取反,取反只在 [] 叫做取反
$ 结束
# 电话
# 长度是11位
# 第一位 [1]
# 第二位 [358]
# 第三位 [56789]
t = '18528322390'
res = re.match('^[123][358][56789]\d{8}$',t)
print(res)
15.1.4 分组匹配
# 第一种情况 首位是0
# 0[1-9] 01 02 03 04 05 06 07 08 09
# 1[0-2] 10 11 12
或者 | shift + \
t = "9999-00-14"
print(re.match('\d{4}-(0[1-9]|1[0-2])-\d{2}',t))
() 起到一个分组的作用
res = re.match('(\d{4})-(0[1-9]|1[0-2])-(\d{2})',t)
print(res.group(1))
print(res.group(2))
print(res.group(3))
print(res.groups())
\1 和第一个分组中的内容相同
\2 和第二个分组中的内容相同
xml = "<title>hello</title>"
res = re.match(r'<(\w+)>(.*)</(\1)>', xml)
print(res)
取别名 (?P<名字>)
(?P=名字)
xml = "<title>hello</title>"
res = re.match(r'<(?P<tag>\w+)>(.*)</(?P=tag)>', xml)
print(res)
15.2 作业
改进 石头剪刀布
制作一个跟电脑对战的剪刀锤子布小游戏(电脑随机出招),进入游戏时候提示当前时间,并需要登录密码。
密码规则:
总共是11位,第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
例如:18601088888、13912366666则满足。
15.3 解析
mport re
import random
# 改进 石头剪刀布
#
# 制作一个跟电脑对战的剪刀锤子布小游戏(电脑随机出招),进入游戏时候提示当前时间,并需要登录密码。
#
#
# 密码规则:
# 总共是11位,第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
# 例如:18601088888、13912366666则满足。
for i in range(3):
mima = input("请输入密码登录:")
res = re.match(r'^1[3458]\d{4}(\d)\1{4}$', mima)
if res != None:
print("登录成功")
count = 3
while count:
a = input("请出拳(石头/剪刀/布):")
b = ['石头', '剪刀', '布']
c = random.choice(b)
win_list = [['石头', '剪刀'], ['剪刀', '布'], ['布', '石头']]
me = print("你出拳:", a)
NPC = print("计算机出拳:", c)
if a in b:
count -= 1
if me == NPC:
print("平局")
elif [me, NPC] == win_list:
print("恭喜你!赢了")
count += 1
else:
print("很遗憾,你输了")
else:
print("输入错误")
print("你还有剩余机会", count)
else:
print("密码错误,登录失败")
print("你还有%d机会" % (2 - i))
print("机会用完,密码还是错误,所以登录失败")