请注意:我正在使用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 否定匹配项(如果后面跟字符)?
答案 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