【问题标题】:Positive lookahead assertion and .* sign in python [duplicate]python中的积极前瞻断言和.*符号[重复]
【发布时间】:2016-06-29 12:00:04
【问题描述】:

我有以下正则表达式:

passw = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$')

我可以解释为长度为 8 的字符串,它必须至少包含一个数字、一个大字母和一个字符($?!)。而且也只包含数字、字母和$?!。

?= - 此符号称为前瞻断言:例如,Isaac (?=Asimov) 将匹配 'Isaac ',仅当它后跟 'Asimov'。

但是我们如何解释.* 符号呢?在正则表达式中是什么意思? 在这种情况下我们可以避免吗?

【问题讨论】:

  • .* 不是一个标志。它是. 字符(意思是“任何字符”)和* 字符(意思是“任意数量(包括零)”)。所以.* 的意思是“任意数量的任意字符”。
  • .* 匹配零次到无限次之间的任何字符(换行符除外)。
  • 您是否有理由尝试在单个正则表达式中进行所有这些检查?您是否考虑过进行两个或三个单独的检查,每个检查都比一个长的正则表达式更易于阅读和维护?

标签: python regex lookahead


【解决方案1】:

事实上,.* 表示任何字符出现零次或多次,并且当它在前瞻中跟随特殊模式时,这意味着正则表达式引擎将断言正则表达式可以匹配。当您在模式之前使用.* 时,您是在告诉正则表达式引擎匹配前面有零个或多个字符的我的模式,这意味着您要确保您的模式存在于您的字符串中(从前导到尾随)。

这是一个带有图表的示例:

(?=.*\d)[a-z]+

Debuggex Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多