【问题标题】:How to print unmatched letter from a pattern如何从模式中打印不匹配的字母
【发布时间】:2018-06-08 15:19:46
【问题描述】:

我有两组蛋白质序列数据。如您所见,这 2 个序列看起来相同,但实际上它们之间有 1 个不同的氨基酸(字母)。

例如:

文件 1:

TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISEVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K

文件 2:

TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISVVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K

期望的输出:

文件 1:

E

文件 2:

V

我知道我们可以使用 grep、comm、diff 命令从两组数据中打印出不同的模式;搜索基于行。但是在这种情况下,如何打印这两种模式之间不同的字母呢?谢谢。

【问题讨论】:

    标签: python r perl pattern-matching letter


    【解决方案1】:

    我认为您在这里不需要re 模块。只需一个循环即可修复您的代码。

    file1='TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISEVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K'
    file2='TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISVVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K'
    for i in range(len(file1)):
        if(file1[i]!=file2[i]):
            print(file1[i]),(file2[i])
    

    你的输出是:E V

    在这里,我们逐个字母比较文件。

    【讨论】:

    • 似乎是最正常的做法
    • 是的,我认为他不需要任何模式匹配方法@InfiniteFlashChess
    【解决方案2】:

    For循环:

    test_two_strings <- function(string1 = file1, string2 = file2){
                              for(i in 1:nchar(file1)){
                                if (substr(file1, i, i) != substr(file2,i, i)){
                                  cat(paste("File 1:", substr(file1, i, i) ,"File 2:", substr(file2, i, i),sep = "\n"))
                                  break()
                                           }
                                      }
                                 }
    
    microbenchmark(test_two_strings(), times = 1000)
    
    VUnit: microseconds
                   expr     min      lq     mean  median      uq      max neval
     test_two_strings() 133.927 144.199 169.5508 148.544 160.791 2132.148  1000
    

    【讨论】:

    • 请注意,我正在按照 OP 的要求打印到控制台。
    • 你打破了循环,这意味着你找到了第一个不匹配,对吧?我的解决方案遍历整个字符串
    • 是的,我一发现第一个不匹配就打破它
    【解决方案3】:

    你也可以试试这个,我通过每两个字符串进行比较,如果条件失败我在字符串之间检查。

    str1 ="TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSESsVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K"
    str2 ="TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSVSsVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K"
    
    for i in range(len(str1)/2):
        if(str1[i:i+2] !=  str2[i:i+2]):
             if  (str1[i:i+1] !=  str2[i:i+1]):
                str1[i:i+1]+"\n"+str1[i+1:i+2]
             else:
                print str1[i+1:i+2]+"\n"+str2[i+1:i+2]
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2021-09-10
      • 1970-01-01
      • 2016-10-23
      • 2017-02-23
      • 2023-04-03
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      相关资源
      最近更新 更多