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个字母序列?的主要内容,如果未能解决你的问题,请参考以下文章