为什么这个(?= ^ \ s *)print_debug正向前瞻与\ s *空格不匹配?

时间:2016-11-25 23:43:49

标签: python regex sublimetext3 lookahead negative-lookahead

为什么此(?=^\s*)print_debug正向前瞻与\s*空格不匹配?

完整的正则表达式模式为(?=^\s*)print_debug。样本匹配是:

print_debug('scroll set: '+str(position));
print_debug('scroll set: '+str(position));
                print_debug('scroll set: '+str(position));
                print_debug('supposed current scroll: '+str(view.viewport_position())); # THIS LIES
            else:
                print_debug('SKIPPED...')

然而,它只匹配前两行:

Only matching the first two lines

以下是在线正则表达式引擎的链接:

  1. https://regex101.com/r/RIIqTg/1
  2. 为什么\s*^一起使用时会被忽略?

    1. 如果您移除^,则\s*开始匹配。
    2. 如果您添加^,则\s*停止工作。
    3. 我希望它在Sublime Text上使用,并禁用Sublime Text包的Python源代码文件中的所有调试语句。

3 个答案:

答案 0 :(得分:1)

根本原因

(?=^\s*)正向前瞻,它匹配行的开头(在SublimeText中,^默认匹配行开头),然后是0+空格(即\s*根本不需要匹配任何文本!)。

因此,如果(?=^\s*)print_debug模式位于字符串的开头,则print_debug模式与(?!^)匹配(请注意,(?<!^)^的工作方式与\K的工作方式相同是零宽度断言)。

解决方案

由于SublimeText正则表达式中没有可变宽度 lookbehind 支持,您可以利用 ^\s*\Kprint_debug 匹配重置运算符

^

请参阅regex demo

<强>详情:

  • \s* - 开始行
  • \h* - 零个或多个空格(可以替换为\K以仅匹配水平空格)
  • print_debug - 省略到目前为止匹配的全文
  • {{1}} - 文字字符串。

enter image description here

答案 1 :(得分:-1)

我认为这实际上是你的积极前瞻,而不是if __FILE__ == $PROGRAM_NAME lines = [] $stdin.each { |line| lines << line} foods = make_database(lines).new puts foods end 。我认为你真正想要的是一个原子组(http://www.regular-expressions.info/atomic.html):

^

这显示了我在每一行的匹配(我甚至在Sublime中测试过它)。

答案 2 :(得分:-1)

(?=^\s*)print_debug表示在匹配位置不仅print_debug必须匹配,还^\s*

匹配位置是“print_debug”的开头和带有可选空格的行的开头。所以只有一行开头的“print_debug”匹配。

如果您只想确保print_debug ,只需使用空格,您应该使用后视:(?<=^\s*)print_debug