正则表达式:允许一次出现某个特征

时间:2014-12-13 02:19:17

标签: regex

我想搜索特定的(DNA)字符串' AGCTAGCT'并允许发生一个(且只有一个)不匹配(表示为' N')。

以下是匹配(无或一个N):

AGCTAGCT
NGCTAGCT
AGCNAGCT

以下不匹配(两个或更多Ns):

AGNTAGCN
AGNTANCN

4 个答案:

答案 0 :(得分: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]*$/

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

答案 1 :(得分: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)

然后,您可以从四个字母中获得所有排列。

答案 2 :(得分:0)

在开头使用否定前瞻来检查字符串是否包含两个N

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

我认为你的字符串只包含AGCTN个字母。

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

或者只是这样,

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

DEMO

答案 3 :(得分:-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.