Python 函数查找两个字符串中未给出正确输出的所有公共子字符串

Python 函数查找两个字符串中未给出正确输出的所有公共子字符串,python,string,substring,Python,String,Substring,我使用以下函数查找两个字符串之间的所有公共子字符串: def substringFinder(string1, string2): answer = "" anslist=[] len1, len2 = len(string1), len(string2) for i in range(len1): match = "" for j in range(len2): if (i + j < len1 an

我使用以下函数查找两个字符串之间的所有公共子字符串:

def substringFinder(string1, string2):
    answer = ""
    anslist=[]
    len1, len2 = len(string1), len(string2)
    for i in range(len1):
        match = ""
        for j in range(len2):
            if (i + j < len1 and string1[i + j] == string2[j]):
                match += string2[j]
                j=j+1
            else:
                #if (len(match) > len(answer)): 
                answer = match
                if answer != '':
                    anslist.append(answer)
                match = ""

        if match != '':
            anslist.append(match)
        break
    print(anslist)
def子字符串查找器(string1、string2):
答案=”“
anslist=[]
len1,len2=len(string1),len(string2)
对于范围内的i(len1):
match=“”
对于范围内的j(len2):
如果(i+jlen(回答)):
答案=匹配
如果回答!='':
anslist.append(答案)
match=“”
如果匹配!='':
anslist.append(匹配)
打破
打印(列表)
因此,当我使用substringFinder(“ALISSA”、“ALYSSA”)时,它会给出
['AL','SSA']
,这很好。但是当我执行
子字符串查找器(“AHAMMAD”、“AHAMAD”)
时,它只提供输出
['AHAM']
,但我希望
['AHAM',MAD']
作为输出。怎么弄到的

  • 不要
    break
  • 在添加字符串之前检查字符串的长度,以避免出现类似
    “A”
  • 返回函数结果,而不是在函数内部打印
  • 像这样:

    def substringFinder(string1, string2):
        answer = ""
        anslist=[]
        len1, len2 = len(string1), len(string2)
        for i in range(len1):
            match = ""
            for j in range(len2):
                if (i + j < len1 and string1[i + j] == string2[j]):
                    match += string2[j]
                else:
                    #if (len(match) > len(answer)): 
                    answer = match
                    if answer != '' and len(answer) > 1:
                        anslist.append(answer)
                    match = ""
    
            if match != '':
                anslist.append(match)
            # break
        return anslist
    
    print substringFinder("AHAMMAD", "AHAMAD")
    
    def子字符串查找器(string1、string2):
    答案=”“
    anslist=[]
    len1,len2=len(string1),len(string2)
    对于范围内的i(len1):
    match=“”
    对于范围内的j(len2):
    如果(i+jlen(回答)):
    答案=匹配
    如果回答!=''和len(答案)>1:
    anslist.append(答案)
    match=“”
    如果匹配!='':
    anslist.append(匹配)
    #中断
    返回列表
    打印子字符串查找器(“AHAMMAD”、“AHAMAD”)
    
    结果:
    ['AHAM','MAD']

    以下是一个简单的暴力解决方案:

    In [7]: def substring_finder(s1, s2):
       ...:     matches = []
       ...:     size = len(s1)
       ...:     for i in range(2, size):
       ...:         for j in range(0, size, i):
       ...:             stop = j+i
       ...:             if stop > size:
       ...:                 continue
       ...:             sub = s1[j:stop]
       ...:             if sub in s2:
       ...:                 matches.append(sub)
       ...:     return matches
       ...:
    
    In [8]: substring_finder("ALISSA", "ALYSSA")
    Out[8]: ['AL', 'SA', 'SSA']
    
    In [9]: substring_finder("AHAMMAD", "AHAMAD")
    Out[9]: ['AH', 'AM', 'MA', 'AHA', 'AHAM']
    
    您可以尝试以下方法:

    def substrings(s1, s2):
        final = [s1[i:b+1] for i in range(len(s1)) for b in range(len(s1))]
    
    
        return [i for i in final if i in s1 and i in s2 and len(i) > 1]
    
    s1, s2 = "ALISSA", "ALYSSA"
    
    
    print(substrings(s1, s2))
    
    输出:

    ['AL', 'SS', 'SSA', 'SA']
    

    为什么
    ['AHAM',AD']
    而不是
    ['AHAM',MAD']
    ?还有,为什么要添加
    中断符
    ?所以对于ALISSA和ALYSSA,正如我提到的,我想要['AL',SSA']。i、 e,查找出现不匹配字符('i'和'Y')的每个部分的最长匹配。对于AHAMMAD和AHAMAD,我想要['AHAM','MAD'],第一个字符串中的不匹配字符是'M'。Rajiv是的,我不确定您的要求是什么。显然,您可以过滤以上内容以满足要求。因此,对于ALISSA和ALYSSA,正如我所提到的,我想要['AL','SSA']。i、 e,查找出现不匹配字符('i'和'Y')的每个部分的最长匹配。对于AHAMMAD&AHAMAD,我想要['AHAM','MAD'],第一个字符串中的非匹配字符是'M'。非常感谢,这就是我要找的!