在Python中尝试在两个字符串中找到匹配项

5

我有一个用户输入的两个字符串,想要检查是否有任何相似的字符,并且如果有,获取第一个相似性出现的位置,但不能使用find或index函数。

以下是我的部分代码,但并不完全有效。通过我目前拥有的代码,我能够找到相似之处,但是我不确定如何在不使用index函数的情况下找到这些相似之处的位置。

string_a = "python"

string_b = "honbe"

same = []

a_len = len(string_a)
b_len = len(string_b)

for a in string_a:
    for b in string_b:

        if a == b:
            same.append(b)          

print (same)

现在的输出结果是:

['h', 'o', 'n']

基本上我的问题是,我如何在不使用Python的Index函数的情况下找到这些字符的位置?

5个回答

6
这是使用difflib.SequenceMatcher的完美案例:
import difflib

string_a = 'python'
string_b = 'honbe'

matcher = difflib.SequenceMatcher(a=string_a, b=string_b)
match = matcher.find_longest_match(0, len(matcher.a), 0, len(matcher.b))
match对象将具有属性absize,其中a是从字符串matcher.a开始的起始索引,b是从matcher.b开始的起始索引,size是匹配的长度。
例如:
>>> match
Match(a=3, b=0, size=3)
>>> matcher.a[match.a:match.a+match.size]
'hon'
>>> match.a
3
>>> match.b
0

2
嘿,有没有办法获取匹配数量? - Mohsin

3
你可以使用列表推导式和itertools的组合来解决这个问题。
import itertools
string_a = 'hello_world'
string_b = 'hi_low_old'

same = [ i for i,x in enumerate(itertools.izip(string_a,string_b)) if all(y==x[0] for y in x)]

In [38]: same
Out[38]: [0, 3, 4, 7]

在这里,我们逐个比较两个字符串的元素,并返回所有已找到相似的索引。输出可以轻松更改以包括匹配的字符等信息。此方法可轻松扩展以比较多个单词。


简单而出色。 - peixe

2
你应该迭代索引:
for i in range(len(string_a)):
    for j in range(len(string_b)):
        if string_a[i] == string_b[j]:
            same.append((i, j, string_b[j]))

这将创建一个类似于元组列表的列表,如下所示:
[ (3, 0, "h"), ... ]

2
def find_similarity(string_a, string_b):
    for ia, ca in enumerate(string_a):
        for ib, cb in enumerate(string_b):
            if ca == cb:
                return ia, ib, ca

如果你想得到所有匹配项,而不只是第一个,可以将return语句替换为yield语句,并遍历结果,或者简单地使用:

matches = list(find_similarity(string_a, string_b))

在后一种情况下,您会得到:

list(find_similarity(string_a, string_b))
=> [(3, 0, 'h'), (4, 1, 'o'), (5, 2, 'n')]

0
如果您只需要在Python 3.x中查找字母重叠的索引,可以像这样操作:
str_a = "Python is a great language"
str_b = "languages express meaning"

result = [i for i, (a, b) in enumerate(zip(str_a, str_b)) if a == b]

输出

[8, 9, 13, 14, 17, 24]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接