正则表达式练习网站
regex101: build, test, and debug regexhttps://regex101.com/
8.1 身份证号分析
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
import re
s = '1102231990xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s)
print("re.search获得的为一个对象,无法正常输出:",res)
print("捕获到的列表",res.groupdict()) # 打印捕获到的列表
re.search获得的为一个对象,无法正常输出: <re.Match object; span=(0, 10), match='1102231990'>
捕获到的列表 {'province': '110', 'city': '223', 'born_year': '1990'}
进程已结束,退出代码0
进程已结束,退出代码0
正则表达式命名:括号内为一个捕获组
(?P<province>\d{3})——数字的前3位为省份;
(?P<city>\d{3})——接下来的3为为城市;
(?P<born_year>\d{4})'——接下来的4位为出生年份
research返回的是对象,无法正常输出我们想要的内容,可以有一下两种方法:
方法一:.groupdict()
print("捕获到的列表",res.groupdict()) # 打印捕获到的列表
方法二:循环对象输出
import re
text = "age=30 name=John id=123"
pattern = re.compile(r'(\w+)=(\d+)')
matches = pattern.findall(text)
print(matches)
print(matches[0],matches[1])
for match in matches:
print("Key:", match[0], "Value:", match[1])
8.2 re正则校验用户密码
1.说明
密码很常见,所以密码校验也很常见,比如说注册账户的时候,我们需要对密码的强度进行限制,比如说密码长度、是否包含大小写、不能特殊字符开头等等,我们可以使用正则进行校验。
方法一:
import re
def valid_length(pwd, min_=8, max_=16):
if min_ <= len(pwd) <= max_:
return True, None
else:
return False, "密码长度应在8到16位"
def valid_number(pwd):
match = re.search("[0-9]+", pwd)
if match:
return True, None
else:
return False, "密码应该包含数字"
def valid_upper(pwd):
res = re.search("[A-Z]+", pwd)
if res:
return True, None
else:
return False, "密码应该包含大写字母"
def valid_lower(pwd):
res = re.search("[a-z]+", pwd)
if res:
return True, None
else:
return False, "密码应该包含小写字母"
def valid_start(pwd):
res = re.search("^[a-zA-Z0-9]+", pwd)
if res:
return True, None
else:
return False, "密码应该以字母或数字开头"
def check_special(pwd):
res = re.search(r"[~!@#$%^&*()\-_=+]+", pwd)
if res:
return True, None
else:
return False, "密码应该至少包含一个特殊字符"
def check_pwd(pwd):
# 想校验什么就把方法名添加到这个list里
for temp in [valid_length, valid_number, valid_upper, valid_lower, valid_start, check_special]:
is_ok, error = temp(pwd)
if not is_ok:
return False, error
return True, None
if __name__ == '__main__':
print("check_pwd1:", check_pwd("asaAsaas-asa0"))
print("check_pwd2:", check_pwd("as"))
check_pwd1: (True, None)
check_pwd2: (False, '密码长度应在8到16位')
方法二:
import re
def check_password(pwd):
res = re.search("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_\-+])[A-Za-z\d~!@#$%^&*()_\-+]{8,16}$", pwd)
return True if res else False
# ^匹配字符串的开头
# (?=.*[a-z])表示贪婪匹配a-z前面的字符,任意小写
# (?=.*[A-Z])表示贪婪匹配A-Z前面的字符,任意大写
# (?=.*\d) 表示贪婪匹配任意数字
# (?=.*[~!@#$%^&*()_\-+]) 表示贪婪匹配任意特殊符号
#[A-Za-z\d~!@#$%^&*()_\-+] 表示任意字符
# {8,16},表示密码长度要8-16位
# $ 匹配字符串的末尾
# 密码的要求:包含大小写,数字,特殊字符,长度在8-16位
if __name__ == '__main__':
print('pwd1',check_password("$0asaf6ssaf")) #没有大写和特殊字符
print('pwd2',check_password("Saf6ssaf@")) #正确
print('pwd3', check_password("0Saf6ssaf@")) # 正确
pwd1 False
pwd2 True
pwd3 True
8.3 判断密码是否符合要求
#引用re正则模块
import re
input1 = str(input("请输入密码:"))
#密码强度,//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
Pattern1 = re.compile(r'.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$')
result1 = Pattern1.match(input1)
if result1:
print(input1, "密码符合要求.")
else:
print(input1, "密码不符合要求.")
请输入密码:aAv232@
aAv232@ 密码符合要求.
8.4 检查密码的强度
写一个函数,用正则表达式验证密码的强度,要求:
1.密码的长度大于或等于8位数
2.强:字母+数字+特殊字符
3.中:字母+数字,字母+特殊字符,数字+特殊字符
4.弱:纯数字,纯字母,纯特殊字符
#!/usr/bin/python
import re
def verify_password(password):
printTip = "密码强度:"
m = re.match(r'\d+|[a-z]+|[^a-z0-9]+', password, re.I).span()
print("m=",m) # m是首先匹配到数字的内容,.span返回的是匹配到的数字的下标
print("m1=", m[1])
# a|b,匹配a或b;
# re.I 使匹配对大小写不敏感
# 若匹配的字符长度等于用户输入长度,证明其中一种匹配规则能完整匹配整个密码即纯数字,纯字母,纯特殊字符
if m[1] == len(password):
printTip = printTip + "弱。"
else:
# 这里有三套匹配规则,若数字、字母、或者字符任意一个匹配不到字符,m都为None,否则说明三种情况都有
m1 = re.search(r'\d+', password)
m2 = re.search(r'[a-z]+', password, re.I)
# m3 = re.search(r'[^a-z0-9]+', password, re.I) #任何字母及数字
m3 = re.search(r'[^~!@#$%^&*()_\-+]+', password, re.I) # 特殊字符
# 2个m3都行
if m1 and m2 and m3: #数字,字母,特殊字符三者都有为强
printTip = printTip + "强。"
else:
printTip = printTip + "中。"
return printTip
if __name__ == '__main__':
password = input("请输入密码:")
# 如果用户输入不足8位数,则让用户继续输入
while len(password) < 8:
password = input("密码的长度不足8位数,请重新输入密码:")
print("密码设置成功!" + verify_password(password))
请输入密码:123aqwd123xkwe
m= (0, 3)
m1= 3
密码设置成功!密码强度:中。
请输入密码:daskdj123aADD@
m= (0, 6)
m1= 6
密码设置成功!密码强度:强。
方法二:我写的——判断强和中的地方有问题,运行不了,
#!/usr/bin/python
import re
def verify_password(password):
printTip = "密码强度:"
#先判断密码是否由于单一的数字/字母/字符组成,如果匹配到的长度和密码长度相同即说明密码弱;
m = re.match(r'\d+|[a-z]+|[^a-z0-9]+',password,re.I).span()
if m[1] == len(password):
printTip = printTip + "弱"
elif m == re.match("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_\-+])[A-Za-z\d~!@#$%^&*()_\-+]{8,16}$", password): #判断是否三种情况都有,如果都有的话就是强密码,否则为弱
printTip = printTip + "强"
# else:
# printTip = printTip + "中"
return printTip
if __name__ == '__main__':
password= str(input("请输入密码,包含数字、字母、特殊字符,共8位以上:"))
l = len(password)
while l < 8:
print("密码错误,请重新输入")
break
else:
print("密码正确",verify_password(password))