python - 在 B 中找到 A 中的子串

标签 python python-3.x

假设我有字符串 A:'fytzgearld' 和字符串 B:'gearyd'。我希望从 B 中找到 A 中的主要子字符串。这些子字符串是:('gear', 'd')。所以澄清一下,尽管 'gea' 也出现在 A 中,但我对它不感兴趣,因为它本身是 'gear' 的子集。 'y' 也在两者中,但顺序错误,因为它在 A 中出现在 'gear' 之前,在 B 中出现在它之后。

我一直在尝试编写一个函数来建立这些子字符串,但确实很困难。到目前为止,这是我的尝试:

def subs(s,m,branch=0):

    if s in m: 
        yield s
        return     

    if len(s) == 1: return

    if branch == 1: yield from subs(s[:-1],m,0) 
    yield from subs(s[1:],m,1) 

给出以下内容:

['gea', 'gear', 'gear', 'gear', 'ear', 'ar', 'r', 'gear', 'gear', 'ear', 'ar', 'r', 'gear', 'ear', 'ar', 'r', 'ear', 'ar', 'r', 'ar', 'r', 'r', 'd']

所以我在“gear”中也得到了很多我不需要的子集字符串。我该如何改进我的功能?

更新

所以只是澄清一下。我希望将姓氏相互比较,这就是我试图找到共同子串的原因。因此,子字符串的顺序很重要。 'fytzgearld''gearyd' 共有的 'y' 并不代表这两个名称之间的关系,但末尾的 'd' 是。

最佳答案

这是一个答案,但它可能不是您想要的。

您尝试实现的算法称为 “longest common substring.” . Python 包含它的一个实现,它适用于任何序列类型。

import difflib


def matching_blocks(a, b):
    sm = difflib.SequenceMatcher(None, a, b)
    # last block is a dummy block
    mb = sm.get_matching_blocks()[:-1]
    return [a[m.a:m.a + m.size] for m in mb]

if __name__ == '__main__':
    print(list(matching_blocks(
        'fytzgearld', 'gearyd'
        )))

关于python - 在 B 中找到 A 中的子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58364389/

相关文章:

python - 用 SVG 椭圆弧计算?

python - 如何将所有 .csv 和 .xlsx 文件名与最少一个字符相匹配?

python - 如何解释 Python 3.6 中的 str.maketrans 函数?

python - Matplotlib:如何从轴上删除一个轮廓元素和其他绘制元素?

Python:如何强制 "print"使用 __unicode__ 而不是 __str__,或者自然地使用 "print"消息而不显式调用 unicode()

python - setup.py install 使用 virtualenv 进行开发 - 安装目录或 PYTHONPATH 错误

python - 如何用 selenium 测试 jquery ajax 标签?

python-3.x - 在Docker容器和主机之间同步文件

python - 从列表中以相反的顺序删除短语

javascript - python: 无法打开文件 'scriptbootstrap.py'