我正在尝试创建一个正则表达式,用于接受由字母和数字组成的 8 个字符的字符串,而不仅仅是字母或数字。
正则表达式'^[A-Z0-9]{8}$'
是不够的,因为它允许使用'ABCDEFGH'
或'12345678'
之类的词。如何创建一个正则表达式以仅接受包含大写字母和数字(如 'AB123C7Q'
)的 8 个字符字符串?
您需要以前瞻的形式在正则表达式中添加 2 个条件(断言):
^(?=.*[a-zA-Z])(?=.*d)[a-zA-Zd]{8}$
此处使用了 2 个前瞻断言:
-
(?=.*[a-zA-Z])
: 断言我们在前面有一封信 -
(?=.*d)
: 断言我们终于领先一位数字
以下是 Python 社区的替代方案,它使用内置的 str.isalnum
和 str.isdigit
函数提供了更快的 pythonic 解决方案:
调用checkalnum
的自定义函数("检查字符串是否包含字母数字"):
def checkalnum(test_str: str):
if not test_str.isalnum() or len(test_str) != 8:
return False
has_digit, has_letter = False, False
for c in test_str:
if c.isdigit(): has_digit = True
else: has_letter = True
if has_digit and has_letter:
return True
return False
时间性能比较(在 IPython 会话中):
In [811]: test_str = 'AB123C7Q'
In [812]: %timeit re.search(r'^(?=.*[a-zA-Z])(?=.*d)[a-zA-Zd]{8}$', test_str)
1.88 µs ± 284 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [813]: %timeit checkalnum(test_str)
992 ns ± 87.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [814]: