如何匹配(最好在perl中)與查詢字符串匹配的所有字符串,但一個字符除外?匹配任何位置中除字符串之外的所有字符
查詢:TLAQLLLDK
要匹配:xLAQLLLDK
,TxAQLLLDK
,TLxQLLLDK
等
的 'x' 是任何大寫字母 '[A-Z]'。
如何匹配(最好在perl中)與查詢字符串匹配的所有字符串,但一個字符除外?匹配任何位置中除字符串之外的所有字符
查詢:TLAQLLLDK
要匹配:xLAQLLLDK
,TxAQLLLDK
,TLxQLLLDK
等
的 'x' 是任何大寫字母 '[A-Z]'。
使用交替運算符。
^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$
同樣填寫好..
你可以通過寫一個可怕的正則表達式,這將是建立異常緩慢,甚至慢到執行,或者你可以不使用正則表達式爲像這些東西,並寫一個函數,只是比較兩個字符串字符後,允許一個「錯誤」,並返回True,只有當有一個錯誤。
如何匹配(最好在Perl中)與查詢字符串匹配的所有字符串(除了一個字符)?
擴大@Avinash的答案,在運行時動態生成所需的正則表達式:
my $query = 'TLAQLLLDK';
my $re_proto = '(' . join('|', map { (my$x=$query)=~s/^(.{$_})./$1\[A-Za-z]/; $x; } (0 .. length($query)-1)) . ')';
my $re = qr/^$re_proto$/;
my @input = qw(xLAQLLLDK TxAQLLLDK TLxQLLLDK);
my @matches = grep { /$re/ } @input;
print "@matches\n";
(我必須包括[a-z]
過,因爲你的榜樣輸入使用x
爲標記)。
如果您需要經常這樣做,我會建議緩存生成的正則表達式。
這是你在找什麼?
#!/usr/bin/perl
use strict;
my @str = ("ULAQLLLDK","TAAQLLLDK","TLCQLLLDK","TLAQLLLDK");
while(<@str>){
if (/[A-S,U-Z]LAQLLLDK|T[A-K,M-Z]AQLLLDK|TL[B-Z]QLLLDK/){
print "$_\n";
}
}
輸出:
ULAQLLLDK
TAAQLLLDK
TLCQLLLDK
僅當前三個字符中的任何兩個與您的查詢字符串「TLAQLLLDK」相匹配時,此腳本纔會打印 – chetangb
只有9×25 = 225個這樣的字符串,所以你可能也產生所有這些,把它們放在一個哈希比較
use strict;
use warnings;
use 5.010;
my %matches;
my $s = 'TLAQLLLDK';
for my $i (0 .. length($s) - 1) {
my $c = substr $s, $i, 1;
for my $cc ('A' .. 'Z') {
substr(my $ss = $s, $i, 1) = $cc;
++$matches{$ss} unless $cc eq $c;
}
}
printf "%d matches found\n", scalar keys %matches;
for (qw/ TLAQLLLDK TLAQLXLDK /) {
printf "\$matches{%s} = %s\n", $_, $matches{$_} // 'undef';
}
輸出
225 matches found
$matches{TLAQLLLDK} = undef
$matches{TLAQLXLDK} = 1
這可以在Python'regex'包中完成(必須從pypy安裝)。 – nhahtdh