假设我有字符串 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/