2014-12-13 40 views
-1

我想要搜索特定的(DNA)字符串'AGCTAGCT'并允许发生一个(且只有一个)不匹配(表示为'N' )。正则表达式:允许多达一次出现某个字符

以下是比赛(没有或一个N):

AGCTAGCT 
NGCTAGCT 
AGCNAGCT 

以下是不匹配(两个或两个以上NS):

AGNTAGCN 
AGNTANCN 
+3

你需要使用正则表达式吗?为什么不是一个循环? – Lynn 2014-12-13 02:22:41

+0

您正在运行哪个lang? – 2014-12-13 02:38:30

+2

在我看来,'N'代表'A','T','C'或'G'中的一个。不是字面的'N',而是错误的核碱基。大多数答案都假定一个字面的“N”。请澄清这一点。 – 2014-12-20 20:25:50

回答

0

在任何语言中,你可以做这样的事情

var count = str.match(/N/g).length; // just count the number of N in the string 
if(count == 1 || count == 0) { // and compare it 
    // str valid 
} 

如果你只想要一个正则表达式,你可以使用这个表达式

/^[^N]*N?[^N]*$/ 

您可以测试字符串是否与上述正则表达式匹配。

+0

我认为这可以简化为'^ [^ N] * N?[^ N] * $' – 2014-12-13 02:26:24

+1

他想匹配'AGCTAGCT',而不是任何字符串。 – 1010 2014-12-13 02:38:24

+0

这个答案的一个小变化是'/^[^ N] *(N [^ N] *)?$ /'。我觉得这种风格更容易理解。 – AdrianHHH 2014-12-14 13:41:11

0

如果你正在使用python,你可以把它无需正则表达式:

myList = [] 

for word in dna : 
    if word.count('N') < 2 : 
     myList.append(word) 

而现在,如果你想生成所有的DNA,我不知道DNA是如何发生的信件,但是这可以为您节省:

import itertools 

letters = ['A', 'G', 'C', 'T', 'N'] 

for letter in itertools.permutations(letters): 
    print ''.join(letter) 

然后,您将拥有四个字母中的所有排列组合。

+0

我不明白你如何接受'AGCTAGCT',最多只有一个N. – 1010 2014-12-13 02:48:33

+0

'word.count('N')<2'可以是'一个N或不是N' – Abdelouahab 2014-12-13 02:49:50

+0

他只想要'AGCTAGCT',而不是'AGCTAGCT'任何一个字符串中最多一个N. – 1010 2014-12-13 02:50:50

0

在开始时使用反向查找来检查字符串是否包含两个N's或不是。

^(?!.*?N.*N)[AGCTN]{8}$ 

我假设你的字符串只包含AGCTN字母。

^(?!.*?N.*N)[AGCTN]+$ 

或者干脆这样,

^(?!.*?N.*N).+$ 

DEMO

+1

再一次,这是在字符串中寻找一个字面的'N'字符。 DNA序列不含'N'字符。 – 2014-12-20 20:36:53

-3

我觉得正则表达式是不是这样做的最佳选择。我说这是因为(至少据我所知),除了明确考虑所有可能的错误之外,没有简单的方法来表达任意字符串以至多与一个错误匹配。 正说,它会是这样的

AGCTAGCT|NGCTAGCT|ANCTAGCT|AGNTAGCT|AGCNAGCT|AGCTNGCT|AGCTANCT|AGCTAGNT|AGCTAGCN 

也许它可以简化一点。

编辑 鉴于N是一个不匹配,接受你想要的东西的正则表达式应该用错误的替代替换每个N.

AGCTAGCT|[GCT]GCTAGCT|A[ACT]CTAGCT|AG[AGT]TAGCT|AGC[AGC]AGCT 
|AGCT[GCT]GCT|AGCTA[ACT]CT|AGCTAG[AGT]T|AGCTAGC[AGC] 

简化...

(A(G(C(T(A(G(C(T|[AGC])|[AGT]T)|[ACT]CT)|[GCT]GCT)|[AGC]AGCT)|[AGT]TAGCT)|[ACT]CTAGCT)|[GCT]GCTAGCT) 

演示与错误的选择https://regex101.com/r/bB0gX1/1用N。

+0

机器完成的自动任务在哪里? – Abdelouahab 2014-12-13 02:32:06

+0

他想与AGCTAGCT匹配,最多只有一个N – 1010 2014-12-13 02:33:23

+0

是的,但是他必须全部用手写出来并用他的眼睛数出来! – Abdelouahab 2014-12-13 02:34:07

相关问题