Regex 匹配字符串中除任何位置的字符外的所有字符
如何匹配(最好是在perl中)除一个字符外与查询字符串匹配的所有字符串 查询:Regex 匹配字符串中除任何位置的字符外的所有字符,regex,perl,Regex,Perl,如何匹配(最好是在perl中)除一个字符外与查询字符串匹配的所有字符串 查询:tlaqlldk 要匹配:xLAQLLLDK,TxAQLLLDK,tlxqlldk等 其中“x”是任何大写字母“[A-Z]”。使用交替运算符 ^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$ 同样,填写所有..使用交替运算符 ^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$ 同样地,填充所有..您可以
tlaqlldk
要匹配:xLAQLLLDK
,TxAQLLLDK
,tlxqlldk
等
其中“x”是任何大写字母“[A-Z]”。使用交替运算符
^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$
同样,填写所有..使用交替运算符
^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$
同样地,填充所有..您可以通过编写一个糟糕的正则表达式来实现这一点,该正则表达式的构建速度非常慢,执行速度甚至更慢,或者您也可以不使用正则表达式来实现这一点,只需编写一个函数,将两个字符串逐个字符进行比较,就可以避免一个“错误”只有在只有一个错误的情况下才返回True。您可以通过编写一个糟糕的正则表达式来实现这一点,它的构建速度非常慢,执行速度也非常慢,或者您可以不使用正则表达式来实现这一点,而只编写一个函数来逐个字符地比较两个字符串,允许出现一个“错误”仅当只有一个错误时才返回True 如何匹配(最好是在perl中)除一个字符外与查询字符串匹配的所有字符串 通过在运行时动态生成所需的正则表达式,扩展@Avinash的答案:
my$query='tlaqlldk';
my$re_proto='('.join('|',map{(my$x=$query)=~s/^(.{$\u})。/$1\[A-Za-z]/;$x;}(0..length($query)-1));
我的$re=qr/^$re_原型$/;
my@input=qw(xLAQLLLDK txaqlldk tlxqlldk);
my@matches=grep{/$re/}@input;
打印“@matches\n”;
(我还必须包括[a-z]
,因为您的示例输入使用x
作为标记。)
如果您需要经常这样做,我建议您缓存生成的正则表达式
如何匹配(最好是在perl中)除一个字符外与查询字符串匹配的所有字符串
通过在运行时动态生成所需的正则表达式,扩展@Avinash的答案:
my$query='tlaqlldk';
my$re_proto='('.join('|',map{(my$x=$query)=~s/^(.{$\u})。/$1\[A-Za-z]/;$x;}(0..length($query)-1));
我的$re=qr/^$re_原型$/;
my@input=qw(xLAQLLLDK txaqlldk tlxqlldk);
my@matches=grep{/$re/}@input;
打印“@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";
}
}
这就是你要找的吗
#!/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";
}
}
只有9 x 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
只有9 x 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安装)中完成。这可以在Pythonregex
包(必须从pypypy安装)中完成。这可以在Pythonregex
包(必须从pypypy安装)中完成。仅当前三个字符中的任意两个与查询字符串匹配时,才会打印此脚本“tlaqlldk”仅当前三个字符中的任意两个与查询字符串“tlaqlldk”匹配时,此脚本才会打印。仅当前三个字符中的任意两个与查询字符串“tlaqlldk”匹配时,此脚本才会打印