用于强制执行字符串的正则表达式包含英文字母和数字



我正在尝试创建一个正则表达式,用于接受由字母和数字组成的 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.isalnumstr.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]: 

最新更新