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})
详情
^
- 字符串开头
\d+ +
- 1+ 个数字,然后 1+ 个空格
(?<=.{11})
- 正向后视检查需要紧邻当前位置左侧的 11 个字符。
请注意:我在 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})
详情
^
- 字符串开头\d+ +
- 1+ 个数字,然后 1+ 个空格(?<=.{11})
- 正向后视检查需要紧邻当前位置左侧的 11 个字符。