找到字符串之间的差异

时间:2012-05-27 15:17:43

标签: python string

我有以下函数获取源和修改后的字符串,并在其中加粗更改的单词。

def appendBoldChanges(s1, s2):
    "Adds <b></b> tags to words that are changed"
    l1 = s1.split(' ')
    l2 = s2.split(' ')
    for i, val in enumerate(l1):
        if l1[i].lower() != l2[i].lower():
            s2 = s2.replace(l2[i], "<b>%s</b>" % l2[i])

    return s2
print appendBoldChanges("britney spirs", "britney spears") # returns britney <b>spears</b>

它可以在具有相同字数的字符串上正常工作,但会因sora iro dayssorairo days而无法使用不同的字数。

如何考虑间隔?

3 个答案:

答案 0 :(得分:21)

您可以使用difflib,并按照以下方式执行操作:

from difflib import Differ

def appendBoldChanges(s1, s2):
    "Adds <b></b> tags to words that are changed"
    l1 = s1.split(' ')
    l2 = s2.split(' ')
    dif = list(Differ().compare(l1, l2))
    return " ".join(['<b>'+i[2:]+'</b>' if i[:1] == '+' else i[2:] for i in dif 
                                                           if not i[:1] in '-?'])

print appendBoldChanges("britney spirs", "britney sprears")
print appendBoldChanges("sora iro days", "sorairo days")
#Output:
britney <b>sprears</b>
<b>sorairo</b> days

答案 1 :(得分:2)

查看difflib模块,您可以使用SequenceMatcher在文本中查找更改的区域。

答案 2 :(得分:1)

小升级tp @fraxel答案,返回2个输出 - 原始版本和新版本带有标记的更改。 在我看来,我也将单行更改为更易阅读的版本

$sql = "INSERT INTO users (email, password, firstname, lastname, date, position, department, manager, birthdate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

if($stmt = mysqli_prepare($link, $sql)){
    mysqli_stmt_bind_param($stmt, "sssssssss", $param_email, $param_password, $param_firstname, $param_lastname, $param_department, $param_position, $param_manager, $param_date, $param_birthdate);

    $param_email = $email;
    $param_password = password_hash($password, PASSWORD_DEFAULT);
    $param_firstname = $firstname;
    $param_lastname = $lastname;
    $param_department = $department;
    $param_position = $position;
    $param_manager = $manager;
    $param_date = $date;
    $param_birthdate = $birthdate;

    if(mysqli_stmt_execute($stmt)){
        // Redirect to login page
        header("location: index.php");
    } else{
        echo "Something went wrong. Please try again later.";
    }
}

mysqli_stmt_close($stmt);