【问题标题】:python difflib print only matches part between two stringspython difflib print 只匹配两个字符串之间的部分
【发布时间】:2018-06-28 14:58:17
【问题描述】:

我对 python 完全陌生,我需要一些关于 difflib 的帮助。我尝试阅读文档,但对我来说理解文档并不容易。

我想比较两个字符串,我希望输出只是两个字符串之间的匹配前缀部分(不打印差异)。

例子:

t1 = "hello my name is Tom" 
t2 = "hello his name is Sawyer"

预期输出为:"hello"

我尝试了以下方法,但输出不是我想要的,因为它将输出打印为数组并且不仅打印匹配部分:

#!/usr/bin/python

import difflib
t1 = "hello my name is Tom"
t2 = "hello his name is Sawyer"
seq = difflib.Differ()
seq = seq.compare(t1,t2)
print list(seq)

其他示例-2:

t1 = "20180628-153020"
t2 = "20180628-173020"

预期的输出打印输出: “20180628-1” 而后缀“3020”即使字符串的位置和字符都匹配,也应该忽略。

请帮帮我..谢谢...

2018 年 7 月 2 日更新

我编写了一个小代码来仅获取两个字符串之间前缀的相似部分(不使用takewhile 作为@Eugene 的第一个答案),但我认为@Eugene 在答案中编写的第二个代码更短更高效比我的。 这是我的代码:

def getprefix(s1, s2):
    pref = ""
    ls1 = list(s1)
    ls2 = list(s2)
    i=0
    while i < len(ls1):
        if ls1[i] not in ls2[i]:
            return pref
        pref += ls1[i]
        i += 1

【问题讨论】:

    标签: python compare match difflib


    【解决方案1】:
    In [1]: from itertools import takewhile
    In [2]: ''.join(a for (a, b) in takewhile(lambda (a, b): a == b, zip(t1, t2)))
    Out[2]: '20180628-1'
    

    这里我们将两个字符串压缩在一起,并在它们的前缀相等时对其进行迭代。

    更新。不使用itertools的等效解决方案:

    result = []
    for a, b in zip(t1, t2):
        if a != b:
            break
        result.append(a)
    return ''.join(result)
    

    【讨论】:

    • 绝对是先生!谢谢:)
    • btw @Eugene,如果我的实时系统没有 itertools,还有什么其他方法?我也无权向系统添加新模块。有什么想法吗?。
    • @guete itertools 不是自定义模块,而是标准 python 库的一部分。所以我想你可以访问它。无论如何,您可以将takewhile 替换为for(我会更新我的答案)
    • 感谢@Eugene。我还编写了一些代码来替换 takewhile。但我认为你的代码比我的更短。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多