Regex 有没有一种方法可以;允许;perl正则表达式在尝试匹配时一次忽略1个字符?
基本上,我有几个文件,每个文件都有几行文本,我感兴趣的是找到一个由7个字母组成的特定序列,并使用Perl(v5.24.1)上的一些基本正则表达式计算每个文件出现的时间 到目前为止没有问题,但“棘手”的部分是,如果这七个字母中有一个与我的模式不匹配,我也会数一数(只要只有一个) 我正在寻找的模式:Regex 有没有一种方法可以;允许;perl正则表达式在尝试匹配时一次忽略1个字符?,regex,perl,match,Regex,Perl,Match,基本上,我有几个文件,每个文件都有几行文本,我感兴趣的是找到一个由7个字母组成的特定序列,并使用Perl(v5.24.1)上的一些基本正则表达式计算每个文件出现的时间 到目前为止没有问题,但“棘手”的部分是,如果这七个字母中有一个与我的模式不匹配,我也会数一数(只要只有一个) 我正在寻找的模式: 'CCCAGGT'、'CCCAGTT'、'CCCAGCT'和'CCCAGAT'。 我想列举的不匹配文本示例: line1 - AGGCTCAGGAG'CCCATGT'GGGCGGACCCAT -->
'CCCAGGT'、'CCCAGTT'、'CCCAGCT'和'CCCAGAT'。
我想列举的不匹配文本示例:
line1 - AGGCTCAGGAG'CCCATGT'GGGCGGACCCAT --> Count as 'CCCAGGT'
line2 - CGGCTCAGGAG'CCCGGGT'GGGCGGTCCCAT --> Count as 'CCCAGGT'
我包括一段代码(在底部)来进一步解释我正在搜索的内容和我到目前为止的想法,但这必须是一种更好的方法
那么,您知道当使用=~m/
操作符时,是否可以“告诉”Perl我可以容忍序列中的1个不匹配?还是要使用另一个函数
非常感谢你的帮助
if($elements[0]=~m/CCCAGGT/){
$mutg=$mutg+$elements[1];
}
elsif($elements[0]=~m/CCCAGTT/){
$mutt=$mutt+$elements[1];
}
elsif($elements[0]=~m/CCCAGAT/){
$muta=$muta+$elements[1];
}
elsif($elements[0]=~m/CCCAGCT/){
$mutc=$mutc+$elements[1];
}
否则{
如果($elements[0]=~m/.CCAGGT/){
$mutg=$mutg+$elements[1];
}
elsif($elements[0]=~m/.CCAGTT/){
$mutt=$mutt+$elements[1];
}
elsif($elements[0]=~m/.CCAGAT/){
$muta=$muta+$elements[1];
}
elsif($elements[0]=~m/.CCAGCT/){
$mutc=$mutc+$elements[1];
}
否则{
[[再次,但在第二个位置使用“.”等]]
}
}
使用正则表达式可能是可行的,但它会过于复杂,正则表达式不是为模糊匹配而设计的。你可以考虑一下。正常的接口需要首先把你的线变成可能的序列来考虑。
use strict;
use warnings;
use Text::Fuzzy;
my $fuzzy = Text::Fuzzy->new('CCCAGGT', max => 1);
my @matches = $fuzzy->nearestv(\@possible);
fuzzy_index函数在搜索类似于regex的更大文本字符串时也很有用,但只返回字符串中最接近的匹配项。为了简单地检查是否存在匹配项(而不是查找最接近的匹配项),我们可以动态地构建模式(
.CCAGGT
,C.CAGGT
),等等
my $target_seq = "CCCAGGT";
my @parts = map quotemeta, split //, $target_seq;
my $fuzzy_pat =
join "|",
map { join("", @parts[0..$_-1], ".", @parts[$_+1..$#parts]) }
0..$#parts;
my $fuzzy_re = qr/$fuzzy_pat/;
这可以扩展为一次检查多个序列,只要一个人不在乎找到了哪个序列
use List::Util qw( uniq );
my @target_seqs = qw( CCCAGGT CCCAGTT CCCAGAT CCCAGCT );
my @fuzzy_pats;
for my $pat (@target_seqs) {
my @parts = map quotemeta, split //, $pat;
for my $i (0..$#parts) {
push @fuzzy_pats, join("", @parts[0..$i-1], ".", @parts[$i+1..$#parts]);
}
}
my $fuzzy_pat = join "|", sort uniq @fuzzy_pats;
my $fuzzy_re = qr/$fuzzy_pat/;
$mtg += $elements[1] if $elements[0] =~ $fuzzy_re;
这是你想要的吗<代码>/.CCAGGT | C.CAGGT | CC.AGGT | CCC.GGT | CCCA.GT | CCCAG.T | CCCAGG./这很可怕,但如果它起作用,那就是一个开始。提示:搜索
CCCAGGT
没有意义,如果你不在乎是哪一个matched@ikegami尽管如此,我仍在努力决定是否将它们全部计算在内,或者计算所有的不匹配项,但指出其中有多少项具有“可接受”的不匹配项。谢谢你!您是否也对捕获小的插入/删除或仅替换感兴趣?@AndreaT。目前,INDEL的管理方式不同,因此在这个问题中,这是不可能的。我已经用ikegami(还有一些暗黑破坏神Jerius)的答案解决了这个问题。。还有一个问题是,即使它真的起作用了,它在搜索多个字符串中的多个序列时也不会像OP一样有效wants@ikegami对象接口不搜索字符串。因此需要首先找到要匹配的子字符串。如何或是否可行需要更多的信息(至少对我来说)。好吧,我想你可以找到每一个长度为L的子串。其中有N+L-1个。这可能会使解成为O(N^2)而不是O(N),因此对于手头的问题来说,这是一个糟糕的选择