Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 有没有一种方法可以;允许;perl正则表达式在尝试匹配时一次忽略1个字符?_Regex_Perl_Match - Fatal编程技术网

Regex 有没有一种方法可以;允许;perl正则表达式在尝试匹配时一次忽略1个字符?

Regex 有没有一种方法可以;允许;perl正则表达式在尝试匹配时一次忽略1个字符?,regex,perl,match,Regex,Perl,Match,基本上,我有几个文件,每个文件都有几行文本,我感兴趣的是找到一个由7个字母组成的特定序列,并使用Perl(v5.24.1)上的一些基本正则表达式计算每个文件出现的时间 到目前为止没有问题,但“棘手”的部分是,如果这七个字母中有一个与我的模式不匹配,我也会数一数(只要只有一个) 我正在寻找的模式: 'CCCAGGT'、'CCCAGTT'、'CCCAGCT'和'CCCAGAT'。 我想列举的不匹配文本示例: line1 - AGGCTCAGGAG'CCCATGT'GGGCGGACCCAT -->

基本上,我有几个文件,每个文件都有几行文本,我感兴趣的是找到一个由7个字母组成的特定序列,并使用Perl(v5.24.1)上的一些基本正则表达式计算每个文件出现的时间

到目前为止没有问题,但“棘手”的部分是,如果这七个字母中有一个与我的模式不匹配,我也会数一数(只要只有一个)

我正在寻找的模式:
'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),因此对于手头的问题来说,这是一个糟糕的选择