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

时间:2018-12-23 15:09:14

标签: python regex

我正在尝试创建一个正则表达式,以接受由8个字符组成的字符串,该字符串由字母和数字组成,而不仅仅是字母或数字。

正则表达式'^[A-Z0-9]{8}$'不够用,因为它允许像'ABCDEFGH''12345678'这样的词。如何创建一个正则表达式以仅接受包含大写字母和数字的8个字符串,例如'AB123C7Q'

2 个答案:

答案 0 :(得分:4)

您需要以lookahead的形式在正则表达式中添加2个条件(断言):

^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8}$

这里使用了2个先行断言:

  • (?=.*[a-zA-Z]):我们在一封信中断言
  • (?=.*\d):断言我们最后还有一位数字

答案 1 :(得分:0)

以下是 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-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]: