Regex-在给定数量的3个字母序列之后,如何匹配特定的3个字母序列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Regex-在给定数量的3个字母序列之后,如何匹配特定的3个字母序列?相关的知识,希望对你有一定的参考价值。

[我正在研究遗传学,想知道如何才能获取某些DNA数据的第248个3字母序列,所以我试图找到一个正则表达式来匹配它。数据块在每行的开头还有数字,需要与空格一起排除,在排序中只对字母进行计数。基本上每3个letters都算作一个序列,我想找到第248个序列。数据也是字符串格式。

                              atggagga gccgcagtca gatcctagcg tcgagccccc
  241 tctgagtcag gaaacatttt cagacctatg gaaactactt cctgaaaaca acgttctgtc
  301 ccccttgccg tcccaagcaa tggatgattt gatgctgtcc ccggacgata ttgaacaatg
  361 gttcactgaa gacccaggtc cagatgaagc tcccagaatg ccagaggctg ctccccccgt
  421 ggcccctgca ccagcagctc ctacaccggc ggcccctgca ccagccccct cctggcccct
  481 gtcatcttct gtcccttccc agaaaaccta ccagggcagc tacggtttcc gtctgggctt
  541 cttgcattct gggacagcca agtctgtgac ttgcacgtac tcccctgccc tcaacaagat
  601 gttttgccaa ctggccaaga cctgccctgt gcagctgtgg gttgattcca cacccccgcc
  661 cggcacccgc gtccgcgcca tggccatcta caagcagtca cagcacatga cggaggttgt
  721 gaggcgctgc ccccaccatg agcgctgctc agatagcgat ggtctggccc ctcctcagca
  781 tcttatccga gtggaaggaa atttgcgtgt ggagtatttg gatgacagaa acacttttcg
  841 acatagtgtg gtggtgccct atgagccgcc tgaggttggc tctgactgta ccaccatcca
  901 ctacaactac atgtgtaaca gttcctgcat gggcggcatg aaccggaggc ccatcctcac
  961 catcatcaca ctggaagact ccagtggtaa tctactggga cggaacagct ttgaggtgcg
 1021 tgtttgtgcc tgtcctggga gagaccggcg cacagaggaa gagaatctcc gcaagaaagg
 1081 ggagcctcac cacgagctgc ccccagggag cactaagcga gcactgccca acaacaccag
 1141 ctcctctccc cagccaaaga agaaaccact ggatggagaa tatttcaccc ttcagatccg
 1201 tgggcgtgag cgcttcgaga tgttccgaga gctgaatgag gccttggaac tcaaggatgc
 1261 ccaggctggg aaggagccag gggggagcag ggctcactcc agccacctga agtccaaaaa
 1321 gggtcagtct acctcccgcc ataaaaaact catgttcaag acagaagggc ctgactcaga
 1381 ctga

任何帮助都会很棒!我正在为此拉头发

谢谢:)

答案

一种方法是匹配模式的n-1次出现,然后捕获后续出现。

$pattern = '/
 (?(DEFINE)(?<sequence>(?:[a-z][^a-z]*)3)) # define a pattern for a 3 letter sequence
 (?&sequence)247 # consume 247 occurrences 
 (?<match>(?&sequence)) # match 248th occurrence
/x';

if (preg_match($pattern, $data, $matches)) 
  var_dump(preg_replace('/[^a-z]+/', '', $matches['match']));

另一答案

直接与您的数据块进行匹配的一种方法是补偿数字和空格,同时根据需要的次数匹配并捕获类[acgt]的三个字符的所有序列。仅最新的捕获可用。与preg_match一起使用的示例:

/\A(?:((?:[\s\d]*[acgt])3))248/m

请参见regex demo

使用代码:

$re = '/\A(?:((?:[\s\d]*[acgt])3))248/m';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

输出(简体):

array(1)  [0]=> array(2)  [0]=> string(...) " atgg...cgg" [1]=> string(3) "cgg"  

OR如果只想直接匹配目标,则此表达式的变体:

/\A(?:(?:[\s\d]*[acgt])3)247\K(?:[\s\d]*[acgt])3/m

\K使引擎记住上一场比赛的位置,但丢弃该比赛的内容直到该点。参见regex demo

使用代码:

$re = '/\A(?:(?:[\s\d]*[acgt])3)247\K(?:[\s\d]*[acgt])3/m';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

输出:

array(1)  [0]=> array(1)  [0]=> string(3) "cgg"  

很高兴看到这个问题再次出现。 :)

另一答案

使用javascript,您可以使用string.replace()删除空格和数字,然后获取nth 3个字母的序列,例如与string.substring()

const data = `
                              atggagga gccgcagtca gatcctagcg tcgagccccc
  241 tctgagtcag gaaacatttt cagacctatg gaaactactt cctgaaaaca acgttctgtc
  301 ccccttgccg tcccaagcaa tggatgattt gatgctgtcc ccggacgata ttgaacaatg
  361 gttcactgaa gacccaggtc cagatgaagc tcccagaatg ccagaggctg ctccccccgt
  421 ggcccctgca ccagcagctc ctacaccggc ggcccctgca ccagccccct cctggcccct
  481 gtcatcttct gtcccttccc agaaaaccta ccagggcagc tacggtttcc gtctgggctt
  541 cttgcattct gggacagcca agtctgtgac ttgcacgtac tcccctgccc tcaacaagat
  601 gttttgccaa ctggccaaga cctgccctgt gcagctgtgg gttgattcca cacccccgcc
  661 cggcacccgc gtccgcgcca tggccatcta caagcagtca cagcacatga cggaggttgt
  721 gaggcgctgc ccccaccatg agcgctgctc agatagcgat ggtctggccc ctcctcagca
  781 tcttatccga gtggaaggaa atttgcgtgt ggagtatttg gatgacagaa acacttttcg
  841 acatagtgtg gtggtgccct atgagccgcc tgaggttggc tctgactgta ccaccatcca
  901 ctacaactac atgtgtaaca gttcctgcat gggcggcatg aaccggaggc ccatcctcac
  961 catcatcaca ctggaagact ccagtggtaa tctactggga cggaacagct ttgaggtgcg
 1021 tgtttgtgcc tgtcctggga gagaccggcg cacagaggaa gagaatctcc gcaagaaagg
 1081 ggagcctcac cacgagctgc ccccagggag cactaagcga gcactgccca acaacaccag
 1141 ctcctctccc cagccaaaga agaaaccact ggatggagaa tatttcaccc ttcagatccg
 1201 tgggcgtgag cgcttcgaga tgttccgaga gctgaatgag gccttggaac tcaaggatgc
 1261 ccaggctggg aaggagccag gggggagcag ggctcactcc agccacctga agtccaaaaa
 1321 gggtcagtct acctcccgcc ataaaaaact catgttcaag acagaagggc ctgactcaga
 1381 ctga
`

function getNthSequence(n) 
  const sequenceLength = 3
  const startIndex = (n - 1) * sequenceLength

  return data
    .replace(/\s|\d/g, '')
    .substring(startIndex, startIndex + sequenceLength)


console.log(getNthSequence(1))
console.log(getNthSequence(2))
console.log(getNthSequence(248))

以上是关于Regex-在给定数量的3个字母序列之后,如何匹配特定的3个字母序列?的主要内容,如果未能解决你的问题,请参考以下文章

IDA*+剪枝DNA sequence

javascript正则表达式匹配3个数字和3个字母

如何使用 RegEx (C#) 在特定字符串之后匹配字符串

JS中的RegEx找到没有3个相同的连续字符

如何匹配第一个字母或数字后的所有制表符?

R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]