我试图创建一个正则表达式,用于接受由字母和数字组成的8个字符的字符串,而不仅仅是字母或数字。
正则表达式'^[A-Z0-9]{8}$'是不够的,因为它允许像'ABCDEFGH'或'12345678'这样的单词。如何创建正则表达式,使其只接受包含大写字母和数字(如'AB123C7Q' )的8个字符串
发布于 2018-12-23 15:17:56
您需要以前瞻的形式在regex中添加两个条件(断言)
^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8}$这里使用了两个前瞻性断言:
(?=.*[a-zA-Z]):断言我们前面有一封信(?=.*\d):断言我们最后有一位数在前面发布于 2018-12-23 16:33:02
下面是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]: https://stackoverflow.com/questions/53904702
复制相似问题