Python:比较两个字符串并返回它们共有的最长段

标签 python string compare substring

作为 Python 的新手,我编写了一个工作函数,它将比较两个字符串并搜索两个字符串共享的最长子字符串。例如,当函数比较“goggle”和“google”时,它会将“go”和“gle”识别为两个公共(public)子字符串(不包括单个字母),但只会返回“gle”,因为它是最长的。

我想知道是否可以改进/重写我的代码的任何部分,因为它可能被认为冗长且令人费解。我也很高兴看到解决方案的其他方法。提前致谢!

def longsub(string1, string2):
    sublist = []
    i=j=a=b=count=length=0

    while i < len(string1):
        while j < len(string2):
            if string1[i:a+1] == string2[j:b+1] and (a+1) <= len(string1) and (b+1) <= len(string2):
                a+=1
                b+=1
                count+=1
            else:
                if count > 0:
                    sublist.append(string1[i:a])
                count = 0
                j+=1
                b=j
                a=i
        j=b=0
        i+=1
        a=i

    while len(sublist) > 1:
        for each in sublist:
            if len(each) >= length:
                length = len(each)
            else:
                sublist.remove(each)

    return sublist[0]

编辑:比较“goggle”和“google”可能是一个不好的例子,因为它们的长度相等,最长的公共(public)段位于相同的位置。实际输入将更接近于此:“xabcdkejp”和“zkdieaboabcd”。正确的输出应该是“abcd”。

最佳答案

在标准库中实际上恰好有一个函数:difflib.SequencMatcher.find_longest_match

关于Python:比较两个字符串并返回它们共有的最长段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15505363/

相关文章:

android - 上传图像时在google vm中调用python脚本

python - 为什么复制 >= 16 GB 的 Numpy 数组会将其所有元素设置为 0?

C++ 安全高效地将 std::weak_ordering 转换为 int

python - Itertools 与索引的组合

python - views.py 中没有名为 'django.core.context_processors' 的模块

c++ - for 循环 : a string passes from "0" to "9"

string - Perl 字符串,字符串中的变量后跟单引号和另一个字符有什么作用?

java - 将第一个单词移到句子的末尾?

java - 为什么 Collections.max() 不返回字符串集合的实际最大值?

python - 检查字符串的任何字符是否在列表中