Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正向前瞻断言和.*登录python_Python_Regex_Lookahead - Fatal编程技术网

正向前瞻断言和.*登录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中执行所有这些检查?你有没有考虑过做两个或三个单独的检查,每个检查都比一个长正则表达式更容易阅读和维护?