负匹配regexp在perl中不起作用?

时间:2014-09-09 14:50:11

标签: perl

negative regex for perl string pattern match 我看到了这个问题和答案,但哪些答案不适合我的问题。但我的问题也是这样的,我的脚本在下面

 use warnings;
 use strict;
 my @data = <DATA>;
 my @match = grep{m/^SEQ.+(!?ALA)/g} @data;
 print "@match\n";
 __DATA__
 SEQ HMK 112 ALA 123 
 SEQ ALA 322
 SEQ 121 ALA 333
 SEQ 114 PHE 443
 SEQ 11433 GLY 332
 SEQ 1123 VAL 121
 SEQ 1121 ALA 321
 SEQ 981 TRP 44532
 SEQ 887 TRP 90
 SEQ 11 HIS SPR 443
 HTTM SHH 121
 HTTM MME 221
 HTTM VZE 9
 EXP 112
 EXP 334 SMZ 

我希望,首先检查 SEQ 这个词的开头但不匹配 ALA 行。 我希望输出是:

SEQ 114 PHE 443
SEQ 11433 GLY 332
SEQ 1123 VAL 121
SEQ 981 TRP 44532
SEQ 887 TRP 90
SEQ 11 HIS SPR 443

我该怎么做

2 个答案:

答案 0 :(得分:4)

while ( <DATA> ) {
    next if m/ALA/;
    print if m/^SEQ/;
}

我确信有人可以给你一个基于正则表达式的答案,但这个IMO更清楚发生了什么。

我认为你有两个负面匹配问题。一个是.+是贪婪的 - 所以你的'ALA'与之相匹配,而'负面匹配'是真的。 另一个是 - 你有?!错误的方法。

答案 1 :(得分:4)

你真的很接近,正则表达式应该是:

my @match = grep{m/^SEQ(?!.+ALA)/} @data;

只需将模式.+置于否定前瞻中即可 如果它在外面,那么每一行都匹配,因为你正在搜索以SEQ开头的行,后跟任意数量的任何字符(即SEQ HMK 112 ALA 123匹配)然后是不是ALA, - &gt;好的,因为整行之后没有ALA