首页 > 其他分享 >from difflib import SequenceMatcher

from difflib import SequenceMatcher

时间:2023-07-28 20:03:10浏览次数:49  
标签:ratio matcher difflib equal 操作码 序列 import SequenceMatcher

difflib.SequenceMatcher是Python标准库中的一个模块,它用于比较两个序列之间的相似度。它可以用于字符串比较、文件比较等多种场景。

from difflib import SequenceMatcher_SequenceMatcher

matcher.ratio()

在使用SequenceMatcher时,需要创建一个SequenceMatcher对象,并将要比较的两个序列传递给它。然后,可以调用ratio()方法来计算两个序列之间的相似度,返回值为0到1之间的浮点数,表示两个序列的相似程度。

以下是一个使用SequenceMatcher比较两个字符串的例子:

from difflib import SequenceMatcher

a = 'hello world'
b = 'helo wrld'


matcher = SequenceMatcher(None, a, b)
similarity = matcher.ratio()


print(similarity)  # 输出0.9

在这个例子中,我们创建了一个SequenceMatcher对象,并将两个字符串传递给它。然后,我们调用ratio()方法来计算两个字符串之间的相似度,输出结果为0.9,表示两个字符串的相似程度为90%。

其中,matcher.ratio()方法是通过计算匹配序列长度的两倍除以两个序列的总长度得出的。具体来说,它计算的是匹配序列的长度(即两个序列中相同元素的数量)的两倍与两个序列的长度之和的比值。其中,匹配序列是指在两个序列中都存在的最长连续子序列。

假设我们有两个序列ab,它们的匹配序列为c,则matcher.ratio()方法计算的公式为:

from difflib import SequenceMatcher_SequenceMatcher_02

其中,|a| 和 |b| 分别表示序列ab的长度,|c| 表示匹配序列c的长度。因此,matcher.ratio()方法可以用来计算两个序列之间的相似度,值域为0到1之间,值越大表示两个序列越相似。


matcher.get_opcodes()

matcher.get_opcodes()方法是SequenceMatcher对象的一个方法,它返回一个操作码的列表,用于描述如何将一个序列转换为另一个序列。操作码是一个元组,包含五个元素,分别表示操作类型、序列1的起始位置、序列1的结束位置、序列2的起始位置和序列2的结束位置。操作类型有四种,分别是:'equal''replace''delete''insert',分别表示匹配、替换、删除和插入操作。

以下是一个使用get_opcodes()方法的例子,具体来说,这段代码的作用是比较两个字符串ab之间的差异,并获取它们的操作码列表。

from difflib import SequenceMatcher

a = 'hello world'
b = 'helo wrld'

matcher = SequenceMatcher(None, a, b)
opcodes = matcher.get_opcodes()

print(opcodes)  
# 输出[('equal', 0, 2, 0, 2), ('delete', 2, 3, 2, 2), ('equal', 3, 7, 2, 6), ('delete', 7, 8, 6, 6), ('equal', 8, 11, 6, 9)]

在这个例子中,首先,通过SequenceMatcher(None, a, b)创建了一个SequenceMatcher对象,None表示不使用任何特殊的函数来处理序列中的元素,ab分别表示要比较的两个字符串。然后,我们调用get_opcodes()方法来获取操作码的列表,输出结果为[('equal', 0, 2, 0, 2), ('delete', 2, 3, 2, 2), ('equal', 3, 7, 2, 6), ('delete', 7, 8, 6, 6), ('equal', 8, 11, 6, 9)],其表示在将a转换为b时,需要进行的操作序列。

具体来说,这个操作序列的意思是:

  1. 从位置0开始的长度为2的子串匹配,即'he''hel'
  2. 从位置2开始的长度为1的子串从a中删除,即'l'
  3. 从位置3开始的长度为4的子串匹配,即'lo w''lo w'
  4. 从位置7开始的长度为1的子串从a中删除,即'r'
  5. 从位置8开始的长度为3的子串匹配,即'ld''ld'

通过操作码列表,我们可以了解到两个序列之间的具体差异,从而进行后续的处理。


通常情况下,我们可以使用操作码列表diffs来实现文本对齐、文本比较、文本合并等功能。例如,可以根据操作码列表diffssource序列转换为target序列,从而实现文本纠错、文本编辑等功能。

SequenceMatcher还有其他一些方法,例如,get_matching_blocks()方法可以返回匹配块的列表,set_seq1()set_seq2()方法可以重新设置序列等等。这些方法可以根据具体的需求进行使用。















标签:ratio,matcher,difflib,equal,操作码,序列,import,SequenceMatcher
From: https://blog.51cto.com/u_15408171/6886631

相关文章

  • The importance of experience replay database composition in deep reinforcement l
    发表时间:2015(DeepReinforcementLearningWorkshop,NIPS2015)文章要点:这篇文章基于DDPG探索了buffer里面experience的组成对性能的影响。一个重要的观点是,次优的经验也是有利于训练的,少了这些experience会很大程度影响性能(theimportanceofnegativeexperiencesthatareno......
  • The Rising Importance of Automotive Diagnostic Tools in the Repair Industry
    TheRisingImportanceofAutomotiveDiagnosticToolsintheRepairIndustryIntheever-evolvingautomotiveworld,continuousadvancementsintechnologyhavebroughtmajorchangestothewayvehiclesarediagnosedandrepaired.Automotivediagnostictools......
  • vue的router文件里面import路径的时候ts报红色下划线
    Cannotfindmodule'@/views/index/index.vue'oritscorrespondingtypedeclarations.ts(2307)ViewProblem(Alt+F8)Noquickfixesavailable   解决方法在vite-env.d文件中新增declaremodule"*.vue"{  import{DefineComponent}from&......
  • mysqlimport
    mysqlimport为MySQL服务器用命令行方式导入数据补充说明mysqlimport命令为mysql数据库服务器提供了一种命令行方式导入数据工具,它从特定格式的文本文件中读取数据插入MySQL数据库表中。语法mysqlimport(选项)(参数)选项-D:导入数据前清空表;-f:出现错误时继续处理剩余的操......
  • 报from PyQt5.QtWidgets import * ImportError: DLL load failed: %1 不是有效的 Win3
    导入时,报fromPyQt5.QtWidgetsimport*ImportError:DLLloadfailed:%1不是有效的Win32application!查了很多资料,发现原来PyQt5安装包也是区分电脑位数的,我的电脑是32位的,装的PyQt5确是64位的,由于我这边用pipinstallPyQt5一直报timeout错误,所以我采用的是去官网直接下......
  • from dateutil.parser import parse什么作用
    `dateutil.parser`是Python中的一个模块,该模块包含了一个`parse`函数。`parse`函数的作用是将字符串解析为datetime对象。例如,你可以用`parse`函数将日期和时间的字符串格式转换为Python的datetime对象。这个函数能处理很多不同的日期和时间格式,使得它在处理来自不......
  • python import上级目录的py文件
    Python中导入上级目录的py文件在Python中,当我们编写代码时,有时候会遇到需要导入上级目录下的py文件的情况。这可能是因为我们的项目结构需要将相关的代码模块分别放在不同的目录中,或者是为了重用和组织代码。在本文中,我们将介绍几种方法来实现在Python中导入上级目录的py文件的方......
  • 解决ValueError: Tokenizer class LLaMATokenizer does not exist or is not currentl
    ##问题:loadLLaMA7b的weights的时候报错:ValueError:TokenizerclassLLaMATokenizerdoesnotexistorisnotcurrentlyimported.##出现原因:新版transformers里面llama的tokenizer命名为LlamaTokenizer但是旧的模型里面的tokenizer叫LLaMATokenizer##解决方案:改动t......
  • 在C语言中嵌入python,未定义的符号。PyExc_ImportError
    本文是小编为大家收集整理的关于在C语言中嵌入python,未定义的符号。PyExc_ImportError的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。中文English问题描述点击免费获取 CRMEB开源商城系统源码 ......
  • C语言内嵌Python import时提示undefined symbol错误及解决
    项目切gcc4.6版本时,C语言内嵌了python,运行bin文件import时出现importError错误,提示python-2.7.11/lib/python2.7/lib-dynload/_collections.so:undefinedsymbol:_Py_ZeroStruct. 基本代码如下: #include<Python.h>#include<stdio.h>#include<stdlib.h> intmain(......