【问题标题】:Trying to find a match in two strings - Python试图在两个字符串中找到匹配项 - Python
【发布时间】:2013-10-31 21:44:33
【问题描述】:

我有一个用户输入两个字符串,然后我想检查是否有任何相似的字符,如果有,获取第一个相似性出现的位置,而不使用 find 或 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 索引函数的情况下找到这些字符的位置?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:
    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')]
    

    【讨论】:

      【解决方案2】:

      这是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 是@987654331 的起始索引@, size 是匹配的长度。

      例如:

      >>> match
      Match(a=3, b=0, size=3)
      >>> matcher.a[match.a:match.a+match.size]
      'hon'
      >>> match.a
      3
      >>> match.b
      0
      

      【讨论】:

      • 嘿,有什么办法可以得到匹配的数量吗?
      【解决方案3】:

      您可以结合使用列表推导和迭代工具来解决此问题。

      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]
      

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

      【讨论】:

      • 简单而精彩。
      【解决方案4】:

      您应该遍历索引:

      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"), ... ]
      

      【讨论】:

        【解决方案5】:

        如果您只需要在 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]
        

        【讨论】:

          猜你喜欢
          • 2014-02-11
          • 2014-08-05
          • 2015-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多