我正在尝试创建一个正则表达式,以接受由8个字符组成的字符串,该字符串由字母和数字组成,而不仅仅是字母或数字。
正则表达式'^[A-Z0-9]{8}$'
不够用,因为它允许像'ABCDEFGH'
或'12345678'
这样的词。如何创建一个正则表达式以仅接受包含大写字母和数字的8个字符串,例如'AB123C7Q'
?
答案 0 :(得分:4)
您需要以lookahead的形式在正则表达式中添加2个条件(断言):
^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8}$
这里使用了2个先行断言:
(?=.*[a-zA-Z])
:我们在一封信中断言(?=.*\d)
:断言我们最后还有一位数字答案 1 :(得分:0)
以下是 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-Z\d]{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]: