我想搜索特定的(DNA)字符串' AGCTAGCT'并允许发生一个(且只有一个)不匹配(表示为' N')。
以下是匹配(无或一个N):
AGCTAGCT
NGCTAGCT
AGCNAGCT
以下不匹配(两个或更多Ns):
AGNTAGCN
AGNTANCN
答案 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}$
我认为你的字符串只包含A
,G
,C
,T
,N
个字母。
^(?!.*?N.*N)[AGCTN]+$
或者只是这样,
^(?!.*?N.*N).+$
答案 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.