RegEx 如何根据特定位置的字符否定匹配

RegEx how to negate a match based on a character in a specific position

请注意:我在 Python(版本 3.6)中编程,但也想将这些正则表达式也移植到 SAS。

这里的大图是我正在使用 SAS 日志,我想排除打印到日志中的来自 %include 语句的行。基本上,我想要完成的事情看起来像这样:

54210      proc sort data=inds out=outds;

我不想要的行将如下所示:

33406     +%global  var1 var2 var3;

关键是第11个字符会是'+',但是左边总会有一组数字后面跟着一组空格,最后的长度就是11个空格- unless 这是一个 %include 行,我想排除它。

我目前的情况是这样的:

^[0-9]{1,11} (?! {2,10}\+)

这已经成功地从我测试过的日志中准确地获取了我想要的东西,但它远非正确。简单的出路是使用这个表达式:

^[0-9]{1,11} {3,10}

然后添加一个额外条件,如果第 11 个字符是“+”,则忽略该行,但我可以在单个正则表达式中执行此操作吗?我遇到了 lookaheads/lookbehinds 正在处理这个问题,但问题是第一个匹配的组的长度可能会有所不同,它会在预期“+”的位置移动 - 所以有没有一种方法可以匹配其中的一个组一个设定的长度,然后 then 如果后面跟着一个字符则否定匹配?

您可以使用 ^[0-9\s]{,11}\+ 来丢弃不需要的日志。它匹配最多 11 位数字 and/or 空格后跟 +(这似乎是不需要的项目的模式)。如果你想取消匹配,你可以简单地做 not re.match(...).

使用前瞻,您可以拒绝在前 11 个字符中包含 + 的字符串,然后匹配所需的模式:^(?=[^+]{11})[0-9]{1,11} {3,10}.

(?=      # Look ahead and assert equal that ...
   [^+]  # ... anything but a plus ...
   {11}  # ... matches the following 11 characters.
)

您是否考虑过在 SAS 代码中设置适当的日志记录选项,而不是正则表达式过滤,以便首先不记录来自 %include 语句的行?即在程序开始时设置 option nosource2;

文档:

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000279225.htm

您可以使用

^\d+ +(?<=.{11})

regex demo

详情

  • ^ - 字符串开头
  • \d+ + - 1+ 个数字,然后 1+ 个空格
  • (?<=.{11}) - 正向后视检查需要紧邻当前位置左侧的 11 个字符。