在Python前瞻性正则表达式中。*的目的是什么?

时间:2017-08-04 15:35:27

标签: python regex lookahead

我正在学习正则表达式,我发现了一个有趣且有用的页面,用于密码输入验证here。我的问题是关于以下表达式中的.*

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

我理解.*是一个表示任意数量文本(或没有文本)的通配符,但我在这些先行表达式中围绕其目的无法理解。为了使这些前瞻功能符合要求,为什么这些必要?

1 个答案:

答案 0 :(得分:2)

Lookahead意味着直接预测。所以,如果你写:

(?=a)

这意味着第一个字符应为a。有时,例如使用密码检查,您不希望这样。你想表达的地方应该是a。所以:

(?=.*a)

表示第一个字符可以是b8@。但最终应该有一个a

你的正则表达式意味着:

^               # start a match at the beginning of the string
(?=.*[a-z])     # should contain at least one a-z character
(?=.*[A-Z])     # should contain at least one A-Z character
(?=.*\d)        # should contain at least one digit
[a-zA-Z\d]{8,}  # consists out of 8 or more characters and only A-Za-z0-9
$               # end the match at the end of the string

没有.*,就永远不会有匹配,因为:

 "^(?=[a-z])(?=[A-Z])(?=\d)[a-zA-Z\d]{8,}$"

表示:

^               # start a match at the beginning of the string
(?=[a-z])       # first character should be an a-z character
(?=[A-Z])       # first character should be an A-Z character
(?=\d)          # first character should be a digit
[a-zA-Z\d]{8,}  # consists out of 8 or more characters and only A-Za-z0-9
$               # end the match at the end of the string

由于没有同时具有A-Z字符和数字的字符。这永远不会得到满足。

附注:

  1. 我们在前瞻中捕获所以贪婪并不重要;
  2. .默认为not match the new line character;
  3. 即使它确实存在约束^[A-Za-z0-9]{8,}$这意味着您只会在没有新行的情况下验证输入。