3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
直接匹配數(shù)據(jù)塊的一種方法是補(bǔ)償數(shù)字和空格,同時(shí)[acgt]根據(jù)您需要的次數(shù)匹配和捕獲類的三個(gè)字符的所有序列。只有最近的捕獲可用。與 一起使用的示例preg_match:
/\A(?:((?:[\s\d]*[acgt]){3})){248}/m
請(qǐng)參閱正則表達(dá)式演示。
在代碼中:
$re = '/\A(?:((?:[\s\d]*[acgt]){3})){248}/m';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
輸出(簡(jiǎn)化):
array(1) { [0]=> array(2) { [0]=> string(...) " atgg...cgg" [1]=> string(3) "cgg" } }
OR如果您只想直接匹配目標(biāo),則此表達(dá)式的變體:
/\A(?:(?:[\s\d]*[acgt]){3}){247}\K(?:[\s\d]*[acgt]){3}/m
\K讓引擎記住最后一場(chǎng)比賽的位置,但丟棄那場(chǎng)比賽的內(nèi)容直到那一刻。請(qǐng)參閱正則表達(dá)式演示。
在代碼中:
$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" } }
很高興看到這個(gè)問(wèn)題重新打開。:)

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用 JavaScript,您可以刪除空格和數(shù)字,string.replace()然后獲取第n 個(gè)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))
使用 PHP,您可以刪除空格和數(shù)字,preg_replace()然后將字符串拆分為 3 字母字符串?dāng)?shù)組str_split():
<?php
$data = <<<DNA
atggagga gccgcagtca gatcctagcg tcgagccccc
241 tctgagtcag gaaacatttt cagacctatg gaaactactt cctgaaaaca acgttctgtc
301 ccccttgccg tcccaagcaa tggatgattt gatgctgtcc ccggacgata ttgaacaatg
...
DNA;
$sequences = preg_replace('/\s|\d/', '', $data);
$sequences = str_split($sequences, 3);
echo $sequences[0] . PHP_EOL;
echo $sequences[1] . PHP_EOL;
echo $sequences[247];
有關(guān)演示,請(qǐng)參見https://3v4l.org/9mpcE 。
附錄:
我剛剛注意到您似乎正在專門尋找正則表達(dá)式解決方案。但是,從我的回答中可以看出,沒有必要使用正則表達(dá)式來(lái)匹配/獲取第n 個(gè)3 字母序列,我認(rèn)為使用string.substring()(在 JS 中)或str_split()(在 PHP 中)比使用復(fù)雜的正則表達(dá)式模式。然而,正則表達(dá)式是從數(shù)據(jù)字符串中刪除空格和數(shù)字的有效選擇。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
一種方法是匹配模式的 n-1 次出現(xiàn),然后捕獲隨后的出現(xiàn)。
$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']));
}
添加回答
舉報(bào)