判断密码长度
使用内置函数 len()
来获取字符串的长度,并与指定的最小和最大长度进行比较。
判断是否包含小写字母、大写字母、数字和符号
使用字符串的 islower()
、isupper()
和 isdigit()
方法来检查是否包含小写字母、大写字母和数字。对于符号,可以通过遍历字符串并使用 str.isalnum()
方法来判断是否为字母或数字。
判断是否包含连续子串
可以使用正则表达式来检查是否包含连续的三个字符在ASCII表中连续。
综合判断密码是否符合要求
结合上述方法,可以编写一个综合的密码校验函数。
def is_valid_length(password, min_length, max_length):
length = len(password)
return min_length <= length <= max_length
def has_lower_case(password):
return any(c.islower() for c in password)
def has_upper_case(password):
return any(c.isupper() for c in password)
def has_digit(password):
return any(c.isdigit() for c in password)
def has_symbol(password):
return any(not c.isalnum() for c in password)
import re
def has_consecutive_substring(password):
pattern = r'(.)\1\1'
return re.search(pattern, password) is not None
综合判断密码是否符合要求
def is_valid_password(password, min_length, max_length):
return (
is_valid_length(password, min_length, max_length) and
has_lower_case(password) and
has_upper_case(password) and
has_digit(password) and
has_symbol(password) and
not has_consecutive_substring(password)
)
any(c.islower() for c in password) 是一个 Python 中的表达式,用于检查密码字符串中是否至少包含一个小写字母。
表达式的含义:
c 是一个临时变量,它在循环中迭代遍历密码字符串中的每个字符。
c.islower() 是一个字符串方法,用于判断字符 c 是否为小写字母。如果 c 是小写字母,则返回 True,否则返回 False。
for c in password 部分遍历密码字符串中的每个字符,并将每个字符依次赋值给变量 c。
any() 函数接受一个可迭代对象(这里是一个生成器表达式)作为参数,如果其中至少有一个元素为真(非零、非空、非False),则返回 True,否则返回 False。
因此,any(c.islower() for c in password) 的含义是:检查密码字符串中是否至少有一个字符是小写字母。如果字符串中包含至少一个小写字母,整个表达式将返回 True,否则返回 False。
这种写法是一种简洁的方式来检查一个条件是否在一个集合中的任何元素上为真。
定义了一个名为 is_valid_password 的函数,用于判断给定的密码是否符合一系列条件。这些条件包括密码长度在指定范围内、包含小写字母、大写字母、数字、符号,并且不包含连续的子串。
is_valid_password 函数接受三个参数:password(密码字符串)、min_length(密码最小长度)和 max_length(密码最大长度)。
is_valid_length(password, min_length, max_length) 是一个函数,用于判断密码长度是否在指定范围内。函数返回布尔值。
has_lower_case(password) 是一个函数,用于检查密码是否包含小写字母。函数返回布尔值。
has_upper_case(password) 是一个函数,用于检查密码是否包含大写字母。函数返回布尔值。
has_digit(password) 是一个函数,用于检查密码是否包含数字。函数返回布尔值。
has_symbol(password) 是一个函数,用于检查密码是否包含符号。函数返回布尔值。
has_consecutive_substring(password) 是一个函数,用于检查密码是否包含连续的子串。函数返回布尔值。
最终的 return 语句将以上所有条件组合起来,使用逻辑运算符 and 进行连接。这意味着只有当所有条件都为真时,整个表达式才会返回 True,否则返回 False。
所以,函数 is_valid_password 的目的是将多个条件判断组合起来,以便判断给定的密码是否满足复杂的密码规则。在代码中,and 运算符保证了每个条件都被检查,而不仅仅是第一个条件。这样,只有当密码同时满足所有条件时,函数返回 True,表示密码是有效的。
import re:导入 Python 的正则表达式模块 re,以便在函数中使用正则表达式功能。
def has_consecutive_substring(password)::定义了一个名为 has_consecutive_substring 的函数,它接受一个参数 password(密码字符串)。
pattern = r'(.)\1\1':定义了一个正则表达式模式字符串 pattern,它用于匹配连续出现的三个相同的字符。这个正则表达式包含以下部分:
(.):括号中的 . 表示匹配任何一个字符,并使用括号捕获这个字符(分组)。
\1:表示引用第一个捕获的分组,也就是前面的 (.) 捕获的字符。
\1\1:连续两个 \1 表示匹配两个相同的字符,因此这个模式匹配连续出现的三个相同字符。
re.search(pattern, password) is not None:使用 re.search() 函数来在密码字符串中搜索是否有与 pattern 匹配的部分。如果找到匹配的部分,re.search() 将返回一个匹配对象,否则返回 None。这个表达式的结果是一个布尔值,表示是否在密码中找到连续的子串。
return 语句:根据 re.search() 的结果,返回 True 或 False,表示密码中是否包含连续出现的三个相同字符的子串。
password1 = "abcd1111efgh"
password2 = "aabbccddeeff"
对于 password1,它包含连续出现的三个相同字符 "111",因此 has_consecutive_substring(password1) 返回 True。
对于 password2,它不包含连续出现的三个相同字符,因此 has_consecutive_substring(password2) 返回 False。
这个函数的作用是帮助判断密码中是否存在连续出现的子串,以增加密码的复杂度和安全性。
正则表达式
-
.
:匹配任何单个字符,除了换行符。 -
^
:匹配输入字符串的开头。 -
$
:匹配输入字符串的结尾。 -
*
:匹配前面的元素零次或多次。 -
+
:匹配前面的元素一次或多次。 -
?
:匹配前面的元素零次或一次。 -
{n}
:匹配前面的元素恰好 n 次。 -
{n,}
:匹配前面的元素至少 n 次。 -
{n,m}
:匹配前面的元素至少 n 次但不超过 m 次。 -
[]
:用于定义字符集,匹配其中的任何一个字符。 -
[^]
:用于定义反向字符集,匹配不在其中的任何一个字符。 -
()
:用于分组,可以在分组中使用其他正则表达式操作符。 -
|
:用于分隔多个选择,类似于逻辑“或”。 -
\
:用于转义字符,使其失去特殊含义。 -
\d
:匹配任何数字字符,相当于[0-9]
。 -
\w
:匹配任何字母数字字符,相当于[a-zA-Z0-9_]
。 -
\s
:匹配任何空白字符,包括空格、制表符、换行等。 -
\b
:匹配单词的边界,用于限定单词的开始或结束。 -
\A
:匹配输入字符串的开始。 -
\Z
:匹配输入字符串的结束,忽略换行符。
组合和嵌套正则表达式基本构建块是创建更复杂的模式以进行字符串匹配和搜索的关键。
使用括号 ()
来创建分组,然后通过连接、选择和重复符号来组合和嵌套这些分组。
连接多个构建块:
可以使用普通字符将多个构建块连接起来,以匹配一定顺序出现的模式。
\d{3}-\d{2}-\d{4}
匹配了形如 "123-45-6789" 的社会安全号码格式。
分组和选择:
使用括号 () 进行分组,然后使用 | 符号进行选择。
(Mr|Ms|Mrs)\. [A-Z][a-z]+
匹配了 "Mr. Smith"、"Ms. Johnson"、"Mrs. Williams" 等格式的名字。
嵌套分组:
嵌套分组,以创建更复杂的模式。
(abc(def|ghi)xyz)
匹配了 "abcdefxyz" 和 "abcghixyz" 这两种格式。
重复和分组的组合:
可以对分组应用重复符号,以匹配特定模式的多次出现。
(\d{3}-){2}\d{4}
正则表达式匹配了形如 "123-45-6789" 的社会安全号码格式,但重复了两次。
组合多个模式:
使用多个正则表达式构建块,通过 | 符号进行选择。
\d{3}-\d{2}-\d{4}|[A-Za-z]{2}\d{7}
匹配了社会安全号码或学生课程编号。
匹配邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
这个正则表达式用于匹配常见的邮箱地址。它匹配包含 "@" 符号的字符串,其中 "@" 符号前面可以是字母、数字、点、下划线、加号和减号等,后面是域名。
匹配手机号码:
^(\+\d{1,2}\s?)?(\d{10,11})$
这个正则表达式用于匹配各种格式的手机号码,包括可能带有国际区号的情况。
匹配日期格式:
^(0?[1-9]|1[0-2])/(0?[1-9]|[12]\d|3[01])/\d{4}$
这个正则表达式用于匹配常见的日期格式,如 MM/DD/YYYY。
匹配IP地址:
^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$
这个正则表达式用于匹配IPv4地址。
匹配URL:
^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$
这个正则表达式用于匹配常见的URL格式,包括以 "http"、"https" 或 "ftp" 开头的网址。
匹配用户名:
^[a-zA-Z0-9_-]{3,16}$
这个正则表达式用于匹配用户名,用户名可以包含字母、数字、下划线和减号,长度在3到16个字符之间。
匹配邮政编码:
^\d{5}(?:-\d{4})?$
这个正则表达式用于匹配常见的美国邮政编码格式,可以包括可选的4位数字的扩展部分。
匹配HTML标签:
<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)
这个正则表达式用于匹配HTML标签。
匹配全数字字符串:
^\d+$
这个正则表达式用于匹配只包含数字的字符串。
匹配全字母字符串:
^[a-zA-Z]+$
这个正则表达式用于匹配只包含字母的字符串。
匹配中文字符:
^[\u4e00-\u9fa5]+$
这个正则表达式用于匹配中文字符。
匹配手机号码中间四位:
^(\d{3})(\d{4})(\d{4})$
这个正则表达式用于匹配手机号码中间四位。
匹配以字母开头的单词:
^[a-zA-Z]\w*$
这个正则表达式用于匹配以字母开头的单词,可以包含字母、数字和下划线。
匹配包含数字和字母的密码:
^(?=.*\d)(?=.*[a-zA-Z]).{6,}$
这个正则表达式用于匹配包含至少一个数字和一个字母的密码,长度至少为6个字符。
匹配空白行:
^\s*$
这个正则表达式用于匹配只包含空白字符的行。
匹配MAC地址:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
这个正则表达式用于匹配MAC地址。
匹配IPv6地址:
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
这个正则表达式用于匹配IPv6地址。
匹配信用卡号(简化示例):
^\d{4}-?\d{4}-?\d{4}-?\d{4}$
这个正则表达式用于匹配简化的信用卡号。
匹配16进制颜色代码:
^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$
这个正则表达式用于匹配16进制颜色代码。
匹配日期时间(简化示例):
^(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\s([01][0-9]|2[0-3]):[0-5][0-9]$
这个正则表达式用于匹配简化的日期时间格式,如 "YYYY-MM-DD HH:MM"。