正则表达式

 正则表达式练习网站

regex101: build, test, and debug regexicon-default.png?t=N7T8https://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))

  • 31
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值