re.fullmatch()可以消除正则表达式

时间:2016-06-18 17:42:29

标签: python regex

考虑以下正则表达式,它检查密码强度。它有开始和结束字符串锚点,以确保它匹配整个字符串。

pattern = re.compile(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[$@$!%*#?&.])[A-Za-z\d$@$!%*#?&.]{8,}$')
    while True:
        user_pass = input('Enter a secure password: ')
        if re.fullmatch(pattern, user_pass):
            print('Successfully changed password')
            break
        else:
            print('Not secure enough. Ensure pass is 8 characters long with at least one upper and lowercase letter, number,'
                  ' and special character.')

我注意到Python 3.5有一个re.fullmatch(),看起来做同样的事情,但没有字符串锚:

pattern = re.compile(r'(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[$@$!%*#?&.])[A-Za-z\d$@$!%*#?&.]{8,}')
while True:
    user_pass = input('Enter a secure password: ')
    if re.fullmatch(pattern, user_pass):
        print('Successfully changed password')
        break
    else:
        print('Not secure enough. Ensure pass is 8 characters long with at least one upper and lowercase letter, number,'
              ' and special character.')

这是完全匹配的预期目的吗?是否有任何可能导致意外问题的情况?

1 个答案:

答案 0 :(得分:3)

fullmatch()函数和regex.fullmatch()方法are new in Python 3.4

更改日志非常明确:

  

这提供了一种明确匹配目标的方法   避免在代码中$字符丢失的一类微妙错误   更改或添加现有常规的替代方案   表达

因此,您使用它的方式确实是此功能的预期目的。它不会导致意外问题,^$只是在内部谨慎添加。