0

我有一根像GGACATCGCGGTGGATCGAC公司.

如何找到包含(例如)三个G公司有什么顺序吗?

对于这个字符串,它应该是GCGG公司燃气涡轮发电机,或GGACATCG公司.

还需要为几个字母找到这样的子字符串,例如,带有两个字母的子字符串G公司s和一C类(CGAG公司,GGAC公司,GGATC公司,CGG公司)

5
  • 您可能需要给出示例文本和预期输出。我刚试过(?i)克[^g]*克[^g]*克在你的文本上,它返回了GGACATCG公司GGTG公司.
    – 达林
    评论 5月23日0:52
  • 4
    为什么您的预期输出还不包括GACATCGCG公司,GGTG公司GGATCG公司?
    – 尼克
    评论 5月23日1:06
  • 任意顺序的三个G我不明白“按任何顺序”在这里有什么意义。你真的是说“中间还有其他字符”吗?
    – 王渊源
    评论 5月23日1:20
  • 是的,“中间有任意数量的其他字符”是正确的表达方式
    – 戴安娜
    评论 5月24日15:23
  • 我没有尝试在该字符串中找到所有可能的输出,还有更多,只是想显示所需的可变性
    – 戴安娜
    评论 5月24日15:24

4个答案4

重置为默认值
4

滑动窗:

  • 解决这个问题的最好方法是编写一个O(N)算法。
  • 如果字符数是可管理的,那么它可以被调优得相当好。如果没有,您需要编写几个方法,并使您的算法模块化,以便于调试和维护。

代码

定义滑动窗口(s,char_a,char_b,count_a,count_b):res=[]开始=[]对于范围内的i(长度):char=s[i]如果char在(chara,charb)中:开始。追加(i)对于启动中的启动:As,Bs=0,0温度=“”对于范围内的i(开始,长度):字符=s[i]如果char==char_a:As+=1如果char==char_b:Bs+=1温度+=字符如果As==count_a和Bs==coount_b:附件(临时)打破返回ress=“GGACATCGCGGTGGTGGATCGCACACGCGCGGTGATCGATCGCGCGCGCGGCGCGCGATCGCGGGTGCGATCCGGCGCGAGCGCGAGACGACATGCGCCGCGCGCG”打印(_sliding_window(s,'G','C',2,1),“\n”)打印(_sliding_window(s,'G','C',3,0),“\n”)打印(_sliding_window(s,'G','C',1,2),“\n”)打印(_sliding_window(s,'G','C',0,3),“\n”)

注:

  • 在上述算法中,我们首先找到起始索引,然后执行滑动窗口。

  • Sill有一些逻辑问题,我会留给你解决。

  • 如果没有太多数据,可以使用O(N^2)算法,这很容易编写。

打印

['GGAC','GCG','CGG','GGATC','GATCG',‘GCG’,'GCG,‘CGG’,‘GGATC’,‘GATCG’,’GACG’,‘CGG'[‘GGTG’,‘GTGG’,’GGTG‘,’GTGG‘,‘GGTG']['GACATC','CATCG','CGC','CGC','GCC',‘CACG',‘CGC’,‘CGAC’,‘GACATC’[“CCAC”,“CATCC”]

Regex图案

很难为每个案例编写模式。但编写模式的方法如下。

  • 用必要的东西定义前瞻。
  • 为每种情况逐个定义图案,并使用管道连接它们。

对于任何顺序的3G:

(?=.*G.*G.*G)([G].*?[G].*?[G])

代码

进口再进口p=r'(?=.*G.*G.*G)([G].*?[G].*?[G])'s=“”GGACATCGCGGTGGATCGACGACACACGCGGTGCGATCGATCGACCGACCGATCGCGTGGATCGAGCGCGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。GCGG或GTGG或GGACATCG。GCGG或GTGG或GGACATGCGCG。GGACATGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。GCGG或GTGG或GGACATCG。GCGG或GTGG或GGACATGCGCG。GGACATGCGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。"""find_3G=重新查找所有(p,s)打印(find_3G)#请注意“GCG”。G'也是发现的一部分。

打印

['GGACATCG','GGTG','GATCGACG','GACATCGCG',‘GTGG',‘GACGG’,‘GCGG’,“GGATCG”、“GACATGCG”和“GCG”。G','GACATGCG','GCGG','GACATGCG','GCG。G','GACATGCG','GCGG','GTGG','GGACATCG','GCGGGG','GCGCG','GGACATG','GCGCG,'GGCATG',‘GCGCG’,‘GGACATG’,'GCGCG,'GGACATG','GCGCG','GCGG','GTGG',''GGACATCG',''GCGGG'',''GTGG'',“GGACATG”,“GCGCG”,“GGACATG”,'GCGCG','GGACATG',‘GCGCG’,‘GGACTG’,‘GCGCG’,‘GGACATG’,’GCGCG‘]


两个G和一个C的原始蛮力算法如下O(N^2):

定义模式(_P):返回s.count('G')==2和s.count('C')==1定义集合(_C):res=[]对于范围内的i(长度):对于范围(i+1,长度+1)中的j:部分=s[i:j]如果模式(部件)(_P):附件(部分)返回ress=“”“GGACATCGCGGTGGATCGACGACACACGCGGTGCGATCGATCGACCGACCGATCGCGTGGATCGAGCGCGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。GCGG或GTGG或GGACATCG。GCGG或GTGG或GGACATGCGCG。GGACATGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。GCGG或GTGG或GGACATCG。GCGG或GTGG或GGACATGCGCG。GGACATGCGCG。GGACATGCGCGCGGGACATCGCGCG。GGACATGCGCG。"""G、 C=2,1打印(集合)(_C)

打印

[“\nGGAC”,“\nGGCAC”,“\n GGACAT”,“GGAC“,”GGACA“,”nGGACAT“,”GCG“,“CGG”、“CGGT”、“TGGATC”、“GGATC”、“GATCG”、“GATCGA”、“GACG”、“ACGG”,“ACGGA”,“CGG”,“GCGA”,‘GGAC’,‘GGCAC’,‘G GACAT’,‘GCG’,‘CGG’,“CGGT”、“TGGATC”、“GGATC”,“GATCG”、“GATCGA”、“AGCGA”、“ACGG”、,‘CGG’,‘CGGA’,‘GGAC’,‘G GACA’,‘g GACAT’,‘GCG’,“CGG”,‘CGGT’,“TGGATC”、“GGATC”,“GATCG”、“GATCGA”、“GA G”,“GA GA”,“G CATG”,'GACATG','ATGCG','TGCG','GCG'GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT’,‘GGAC’,‘G GACA’,‘g GACAT‘,“GGAC”,“GGACA”,“G GACAT”,“GACATG”,“ATGCG”,‘TGCG’,‘GCG’,‘GCG’,‘GCG’,‘CGG’,'GGAC',‘GGACA’,‘GGCAT’,‘GACATG’,’ATGCG’、‘TGCG’,'GCG','GCG],'GCG,'GCG.','GCG.'GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT’,‘GGAC’,‘G GACA’,‘g GACAT‘,‘G GA C’,’G GACA‘,‘GGA CAT’,'GACATG','ATGCG','TGCG','GCG','GCG','GCG','GCG.','GCG.“,”GCG公司。\n’,'重心。\nG’,'G.\nGC’,'。\nGCG','\nGCG'、'\nGCG'、'GCG','CGG',“CGG”、“CGG o”、“GCG or”、“CCG or”或“,”或“GGAC”、“或GGACA”、“,或GGACAT“,”或GGAC“,”or GGACA“,”or-GGACAT”,“or GGAC”,“or-GGACA”,“或GGACA”,“or GGACAT”、“r GGAC”、“rGGACA”、“r-GGACATs”、“GGAC“、”GGACA“、”GGACAT、GGAC、GGACA、GGACT、ATCG。G’,‘TCG。G','重心。G','G。GC“,”。GCG’、‘GCG’、‘GCG’、‘CGG’、‘CGG’、‘CGG o’、‘CGG or’、‘CGG or’“、”或GGAC“、”、或GGACA“、”,或GGACAT“、”或者GGAC”、“或者GGACA”、“或GGACC”,“或GGACAT”、“或GGAC”、“or GGACA”、“或者GGACAD”、“r GGAC”、,“r GGACAT”、“GGAC”、“GGACA”、“GGACAT”、“GGAC”、“GGACA”、“GGACAT”,'GACATG','ATGCG','TGCG','GCG'GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT’,‘GGAC’,‘G GACA’,‘g GACAT‘,“GGAC”,“GGACA”,“G GACAT”,“GACATG”,“ATGCG”,‘TGCG’,‘GCG’,‘GCG’,“GCG”,“GCG.”,“GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT“,”GGAC’,‘GGACA’,‘G GACAT’,‘g GAC’,“ATGCG”,“TGCG”,“GCG”,'GGACAT','GACATG','ATGCG','TGCG','GCG',“GCG.”,“重心。G','。GGAC“,”。GGACA“,”。“GGACAT”,“GGAC”,“G GACA”,“GGACAT”,“GGAC”,“GGACA”,“GAACAT”,“GACATG”,“ATGCG”,‘TGCG’,'GCG','GCG],'GCG,'GCG.','GCG.'GCG.“,”GCG公司。\n’,'重心。\nG’,'G.\nGC’,'. \nGCG','\nGCG',''\nGCG'、'GCG'、'CGG'、'CGG','CGG o','CGG or',“CGG or”、“or GGAC”、“,or GGACA”、“或GGACAT”、“orGGAC,”或GGACA“,”或“GGACAT”,“或GGAC”,“or GGACA”,“or-GGACAT“,”rGGAC“,”rGGACA’,‘r GGACAT’,‘GGAC’,‘G GACA’,“GGACAT”,“ATCG”。G’,‘TCG。G','重心。G','G.GC','。GCG’,“GCG”,‘GCG’、‘CGG’、’CGG’,‘CGG o’、‘GCG or’、‘IGG or’,‘或GGAC’,‘,或GGACA“,”,或GGACAT“,”或GGAC“,”或者GGACA”,“或GGACAD”,“或者“GGAC”,“or GGACA”,“或GGACAT”,“r GGAC“,”r GGACA“,”GGAC’,‘GGACA’,‘G GACAT’,‘g GAC’,“ATGCG”,“TGCG”,“GCG”GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT’,‘GGAC’,‘G GACA’,‘g GACAT',‘G GA C’,'GGACA','GGACAT','GACATG','ATGCG','TGCG','GCG',“GCG.”,“GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT“,”GGAC“,”GGACA','GGACAT','GGAC','GGACA','GGACAT','GACATG','ATGCG',“TGCG”,“GCG”,“GC”,'GACATG','ATGCG','TGCG','GCG'GCG.“,”重心。G','。GGAC“,”。GGACA“,”。GGACAT’,‘GGAC’,‘G GACA’,‘g GACAT‘,“GGAC”,“GGACA”,“G GACAT”,“GACATG”,“ATGCG”,‘TGCG’,‘GCG’,‘GCG’,“GCG”,“GCG.”,“GCG.“,”GCG公司。\n’]号


注释

  • 该算法可以用O(N)时间复杂度来编写。我只是想在这里展示一下我们如何解决这个问题。

  • 您可以添加方法来处理边缘情况。

  • 算法非常灵活,易于维护和调试。

0
1

在python中,您可以使用正则表达式模块捕获重叠匹配。这可以简化正则表达式。对于3 G,您可以使用:

G[^G]*G[^G]*G

对于2G和1C,有以下三种可能的组合(其中*表示一些非G或C的字符数):

  1. G*G*C公司
  2. G*C*G
  3. C*克*克

这些可以与此正则表达式匹配:

G[^GC]*G[^GC]*C|G[^ GC]*C[^GC]*G|C[^GC]*G[GC]*G

用蟒蛇

导入正则表达式s='GGACATCGCGGTGGATCGAC'regex.findall(r'G[^G]*G[^G]*G',s,overlapped=True)regex.findall(r'G[^GC]*G[^GC]*C|G[^GC]*C[^GC]*C[|GC]*G|C[^GC]*G[GC]*G,s,overlapped=True)

输出:

['GGACATCG','GACATCGCG','GCGG','GGTG','GTGGG,'GGATCG'][‘GGAC’,‘GCG’,‘CGG’,’GGATC’,‘GATCG’]
1

首先,您应该注意,匹配的子字符串必须以所需的字母开头和结尾。

有了这个约束,通过捕获所需的字母和中间可选的其他字符,匹配包含一个确切数字的字母的子字符串是相当简单的:

(?=((?:G[^G]*){2} G公司))

演示:https://regex101.com/r/ajXtbq/1

匹配包含两个精确数字的字母的子字符串要复杂得多。它可以归结为捕获每个字母的所需数量并捕获后面的内容,然后捕获一个子字符串,该子字符串由之前捕获的所需字母之一组成,后跟不是该字母的字符,直到它到达了一个点,在这个点上,后面的内容是前面捕捉到的另一个所需字母后面的内容之一。下面是一个捕获两个子字符串的示例G公司s和1C类:

(?=([^C]*C)(.*$))(?=

演示(在第5组中捕获所需的子字符串):https://regex101.com/r/uCtCfq/1

对于任意数量字母的更通用解决方案,使用带有滑动窗口的计数器更容易、更有效,当计数器小于目标时,滑动窗口会增加结束索引,否则会增加起始索引:

从集合导入计数器定义查找,目标计数:target_counts=计数器(target_contounts)current_counts=计数器()开始=结束=0大小=长度while end<大小:如果当前计数<目标计数:如果(char:=s[end])在target_counts中:current_counts[char]+=1结束+=1其他:当前计数中的if(char:=s[start]):如果current_counts==目标计数:产量s[开始:结束]current_counts[char]-=1开始+=1

以便:

打印(*find(“GGACATCGCGGTGGATCGAC”,{'G':2,'C':1}),sep='\n')

输出:

GGAC公司GCG公司CGG公司GGATC公司关贸总协定

演示在这里

0
1

Python函数来查找所有这些子字符串对于任何数量的字母:

定义find_substrings_with_exact_letters(s,letter_counts):从集合导入计数器结果=[]n=长度total_letters=总和(letter_counts.values())对于范围内的i(n-total_letters+1):substring=s[i:i+total_letters]counts=计数器(子字符串)match=all(counts[char]==letter_counts[char]代表letter_contounts中的char)如果匹配:result.append(子字符串)返回结果#示例用法s=“GGACATCGCGGTGGTGGATCGCACACGCGCGGTGATCGATCGCGCGCGCGGCGCGCGATCGCGGGTGCGATCCGGCGCGAGCGCGAGACGACATGCGCCGCGCGCG”letter_counts_3Gs={'G':3}letter_counts_2Gs_1C={'G':2,'C':1}substrings_3Gs=find_substrings_with_exact_letters(s,letter_counts_3Gs)print(“Substrings with exactly 3 Gs:”,Substrings_3Gs)substrings_2Gs_1C=find_substrings_with_exact_letters(s,letter_counts_2Gs_1C)打印(“Substrings with exactly 2 Gs and 1 C:”,Substrings_2Gs_1C)

修改字母_计数要查找的词典子字符串匹配不同的标准。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.