正向前瞻断言和.*登录python
我有以下正则表达式:正向前瞻断言和.*登录python,python,regex,lookahead,Python,Regex,Lookahead,我有以下正则表达式: passw = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$') 我可以将其解释为长度为8的字符串,该字符串必须至少包含一个数字、一个大号和一个字符($?!)。并且只包含数字、字母和$ ?=-此符号称为先行断言:例如,Isaac(?=Asimov)仅当后跟“Asimov”时才会匹配“Isaac” 但是我们如何解释符号呢?它在正则表达式中是什么意思? 在这种情况下,我们可以避免它吗
passw = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$')
我可以将其解释为长度为8的字符串,该字符串必须至少包含一个数字、一个大号和一个字符($?!)。并且只包含数字、字母和$
?=-此符号称为先行断言:例如,Isaac(?=Asimov)
仅当后跟“Asimov”时才会匹配“Isaac”
但是我们如何解释符号呢?它在正则表达式中是什么意思?
在这种情况下,我们可以避免它吗?事实上,
*
意味着任何字符的出现次数为零或更多,并且当它以特殊模式在前视中跟随时,意味着正则表达式引擎将断言正则表达式可以匹配。当您在模式之前使用*
时,您告诉正则表达式引擎匹配前面有零个或多个字符的my模式,这意味着您希望确保您的模式存在于字符串中(从前导到尾随)
下面是一个带有图表的示例:
(?=.*\d)[a-z]+
*
不是一个符号。它是
字符(表示“任意字符”)和*
字符(表示“任意数量(包括零)”。因此,*
表示“任意数量的任意字符”。*
匹配零次和无限次之间的任意字符(除换行符)。是否有理由尝试在单个regexp中执行所有这些检查?你有没有考虑过做两个或三个单独的检查,每个检查都比一个长正则表达式更容易阅读和维护?