2015-06-19 68 views
1

如何匹配(最好在perl中)與查詢字符串匹配的所有字符串,但一個字符除外?匹配任何位置中除字符串之外的所有字符

查詢:TLAQLLLDK

要匹配:xLAQLLLDKTxAQLLLDKTLxQLLLDK

的 'x' 是任何大寫字母 '[A-Z]'。

+0

這可以在Python'regex'包中完成(必須從pypy安裝)。 – nhahtdh

回答

0

使用交替運算符。

^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$ 

同樣填寫好..

0

你可以通過寫一個可怕的正則表達式,這將是建立異常緩慢,甚至慢到執行,或者你可以不使用正則表達式爲像這些東西,並寫一個函數,只是比較兩個字符串字符後,允許一個「錯誤」,並返回True,只有當有一個錯誤。

0

如何匹配(最好在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爲標記)。

如果您需要經常這樣做,我會建議緩存生成的正則表達式。

0

這是你在找什麼?

#!/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 
+0

僅當前三個字符中的任何兩個與您的查詢字符串「TLAQLLLDK」相匹配時,此腳本纔會打印 – chetangb

0

只有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 
相關問題