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

时间:2018-10-08 20:46:32

标签: python regex sas regex-negation regex-lookarounds

请注意:我正在使用Python(版本3.6)进行编程,但也希望将这些正则表达式也移植到SAS。

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

54210      proc sort data=inds out=outds;

我不想要的行看起来像这样:

33406     +%global  var1 var2 var3;

关键是第11个字符将是'+',但是在左侧始终会有一组数字,后面是一组空格,其长度最终将为11个空格-除非这是%include行,我要排除在外。

到目前为止,我是这样的:

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

这已经从我测试过的日志中准确地获取了我想要的东西,但这远非正确。最简单的方法是使用以下表达式:

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

然后添加一个额外的条件,如果第11个字符是'+',它将忽略该行,但是我可以在单个正则表达式中执行此操作吗?我遇到了前瞻/后顾之忧,但是问题是,第一个匹配组的长度可能会有所不同,会在预期的“ +”位置移动-因此,有一种方法可以匹配一组内的组长度,然后 then 否定匹配项(如果后面跟字符)?

3 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见regex demo

详细信息

  • ^-字符串的开头
  • \d+ +-1个以上的数字,然后是1个以上的空格
  • (?<=.{11})-一种正向后方检查,要求紧接当前位置左侧的11个字符。

答案 1 :(得分:0)

您可以使用^[0-9\s]{,11}\+丢弃不需要的日志。它最多匹配11个数字和/或空格,后跟+(这似乎是不需要的项目的模式)。如果您想取消匹配,只需执行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.
)

答案 2 :(得分:0)

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

文档:

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