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

Why this (?=^\s*)print_debug positive lookahead is not matching the \s* spaces?

为什么这个 (?=^\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...')

但是它只匹配前两行:

这是在线正则表达式引擎的link:

  1. https://regex101.com/r/RIIqTg/1

为什么 \s* 在与 ^ 一起使用时被忽略?

  1. 如果删除 ^\s* 开始匹配。
  2. 如果添加 ^\s* 将停止工作。

我希望它在 Sublime Text 上使用并禁用我的 Python Sublime Text 包源代码文件中的所有调试语句。

我相信实际上是你的积极前瞻把事情搞砸了,而不是 ^。我认为你真正想要的是一个原子组(http://www.regular-expressions.info/atomic.html):

(?>^\s*)print_debug

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

(?=^\s*)print_debug表示匹配的位置不仅要匹配print_debug,还要匹配^\s*.

匹配的位置是一个"print_debug"的开头和一行的开头,可选白色space。所以只有行首的 "print_debug" 匹配。

如果您想确保 print_debug 之前 只有白色 space,您应该改用后视:(?<=^\s*)print_debug

根本原因

(?=^\s*) 是一个 positive lookahead 匹配行的开始(在 SublimeText 中, ^ 默认匹配行开始),然后是 0+ 个空格(即 \s* 根本不必匹配 任何 文本!)。

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

解决方案

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

^\s*\Kprint_debug

regex demo

详情:

  • ^ - 行首
  • \s* - 零个或多个空格(可以替换为 \h* 以仅匹配水平空格)
  • \K - 省略到目前为止匹配的整个文本
  • print_debug - 文字字符串。