标签: difflib

Python中的模糊字符串比较,与使用哪个库相混淆

我想做模糊字符串比较,但与使用哪个库混淆.

选项1:

import Levenshtein
Levenshtein.ratio('hello world', 'hello')

Result: 0.625
Run Code Online (Sandbox Code Playgroud)

选项2:

import difflib
difflib.SequenceMatcher(None, 'hello world', 'hello').ratio()

Result: 0.625
Run Code Online (Sandbox Code Playgroud)

在这个例子中,两者给出了相同的答案.但我更喜欢使用__CODE__.专家的任何建议.谢谢.

__CODE__

我正在进行临床信息规范化(拼写检查),其中我检查每个给定的单词对900,000字的医学词典.我更关注时间复杂度/性能.

在这种情况下,你认为两者都表现相似吗?

python string-matching difflib levenshtein-distance

119
推荐指数
2
解决办法
6万
查看次数

在python中生成和应用差异

在python中是否存在一种"开箱即用"的方式来生成两个文本之间的差异列表,然后将此差异应用于一个文件以获取另一个文件,以后再进行?

我想保留文本的修订历史记录,但如果只有一个编辑的行,我不想保存每个修订版的整个文本.我查看了difflib,但是我看不到如何生成仅包含已编辑行的列表,这些行仍可用于修改一个文本以获取另一个文本.

python diff revision difflib

28
推荐指数
3
解决办法
2万
查看次数

如何使用SequenceMatcher查找两个字符串之间的相似性?

import difflib

a='abcd'
b='ab123'
seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower())
seq=difflib.SequenceMatcher(a,b)
d=seq.ratio()*100
print d
Run Code Online (Sandbox Code Playgroud)

我使用上面的代码,但获得的输出是0.0.我怎样才能得到有效答案?

python difflib

27
推荐指数
2
解决办法
4万
查看次数

在Python中使用difflib比较两个.txt文件

我试图比较两个文本文件并输出比较文件中的第一个字符串,该字符串不匹配但由于我是python的新手而遇到困难.有人可以给我一个使用这个模块的示例方法.

当我尝试这样的事情:

result = difflib.SequenceMatcher(None, testFile, comparisonFile)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,说'file'类型的对象没有len.

python difflib

21
推荐指数
3
解决办法
7万
查看次数

python difflib比较文件

我正在尝试使用difflib为包含推文的两个文本文件生成diff.这是代码:

#!/usr/bin/env python

# difflib_test

import difflib

file1 = open('/home/saad/Code/test/new_tweets', 'r')
file2 = open('/home/saad/PTITVProgs', 'r')

diff = difflib.context_diff(file1.readlines(), file2.readlines())
delta = ''.join(diff)
print delta
Run Code Online (Sandbox Code Playgroud)

这是PTITVProgs文本文件:

Watch PTI on April 6th (7) Dr Israr Shah at 10PM on Business Plus in "Talking Policy". Rgds #PTI
CORRECTION!! Watch PTI on April 6th (5) @Asad_Umar  at 8PM on ARY News. Rgds #PTI
Watch PTI on April 6th (5) @Asad_Umar  at 8PM on AAJ News (6) PTI vs PMLN at 8PM on …
Run Code Online (Sandbox Code Playgroud)

python text difflib

18
推荐指数
2
解决办法
4万
查看次数

python中的序列匹配算法

我有一个句子列表,如:

errList = [ 'Ragu ate lunch but didnt have Water for drinks',
            'Rams ate lunch but didnt have Gatorade for drinks',
            'Saya ate lunch but didnt have :water for drinks',
            'Raghu ate lunch but didnt have water for drinks',
            'Hanu ate lunch but didnt have -water for drinks',
            'Wayu ate lunch but didnt have water for drinks',
            'Viru ate lunch but didnt have .water 4or drinks',

            'kk ate lunch & icecream but did have Water for drinks',
            'M ate …
Run Code Online (Sandbox Code Playgroud)

python nltk difflib scikit-learn

11
推荐指数
2
解决办法
868
查看次数

python中的"diff -u -B -w"?

使用Python,我想将两个字符串之间的差异输出为统一的diff(-u),同时可选地忽略空行(-B)和空格(-w).

由于字符串是在内部生成的,我宁愿不处理将一个或两个字符串写入文件,运行GNU diff,修复输出,最后清理的细微差别.

虽然difflib.unified_diff生成统一的差异,但似乎不允许我调整空格和空行的处理方式.我看过它的实现,我怀疑,唯一的解决方案是复制/破解该函数的主体.

有更好的吗?

目前我正在使用以下内容剥离填充字符:

import difflib
import re
import sys

l = "line 1\nline 2\nline 3\n"
r = "\nline 1\n\nline 2\nline3\n"
strip_spaces = True
strip_blank_lines = True

if strip_spaces:
    l = re.sub(r"[ \t]+", r"", l)
    r = re.sub(r"[ \t]+", r"", r)
if strip_blank_lines:
    l = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", l))
    r = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", r))
# run diff
diff = difflib.unified_diff(l.splitlines(keepends=True), r.splitlines(keepends=True))
sys.stdout.writelines(list(diff))
Run Code Online (Sandbox Code Playgroud)

当然,这会导致输出为除原始输入之外的其他东西的差异.例如,将上面的文本传递给GNU diff 3.3作为"diff -u -w"运行,"line 3"作为上下文的一部分显示,上面将显示"line3".

python difflib

10
推荐指数
1
解决办法
851
查看次数

在python中比较字符串时忽略空格

我正在使用difflib python包.无论我是否设置isjunk参数,计算的比率都是相同的.是不是当忽略空间的区别isjunklambda x: x == " "

In [193]: difflib.SequenceMatcher(isjunk=lambda x: x == " ", a="a b c", b="a bc").ratio()
Out[193]: 0.8888888888888888

In [194]: difflib.SequenceMatcher(a="a b c", b="a bc").ratio()
Out[194]: 0.8888888888888888
Run Code Online (Sandbox Code Playgroud)

python string difflib

9
推荐指数
2
解决办法
5473
查看次数

是否有返回索引(列表位置)而不是 str 列表的 `difflib.get_close_matches()` 的替代方法?

我想使用类似difflib.get_close_matches不是最相似的字符串,我想获取索引(即列表中的位置)。

列表的索引更加灵活,因为可以将索引与其他数据结构(与匹配的字符串相关)相关联。

例如,而不是:

>>> words = ['hello', 'Hallo', 'hi', 'house', 'key', 'screen', 'hallo', 'question', 'format']
>>> difflib.get_close_matches('Hello', words)
['hello', 'hallo', 'Hallo']
Run Code Online (Sandbox Code Playgroud)

我想:

>>> difflib.get_close_matches('Hello', words)
[0, 1, 6] 
Run Code Online (Sandbox Code Playgroud)

似乎不存在获取此结果的参数,是否有替代方法可以difflib.get_close_matches()返回索引?


我对替代方案的研究

我知道我可以使用difflib.SequenceMatcher, 然后将字符串与ratio(或quick_ratio)进行一对一比较。但是,我担心这会非常低效,因为:

  1. 我将不得不创建数千个 SequenceMatcher 对象并比较它们(我希望get_close_matches避免使用该类):

    编辑:错误。我检查了 的源代码get_close_matches,它实际上使用SequenceMatcher.

  2. 没有截止(我猜有一种优化可以避免计算所有字符串的比率)

    编辑:部分错误。该代码是get_close_matches没有任何重大的优化,除了它使用real_quick_ratioquick_ratioratio产品总数。无论如何,我可以轻松地将优化复制到我自己的函数中。我也没有考虑到 SequenceMatcher 有设置序列的方法:set_seq1, set_seq2,所以至少我不必每次都创建一个对象。

  3. 据我了解,所有 python 库都是 C 编译的,这会提高性能。 …

python string similarity difflib python-3.x

9
推荐指数
1
解决办法
4094
查看次数

使用difflib.get_close_matches()忽略大小写

如何告诉difflib.get_close_matches()忽略大小写?我有一个字典,其中包含一个包含大小写的定义格式.但是,测试字符串可能具有完全大小写或没有大小写,这些应该是等效的.但是,结果需要适当地大写,因此我不能使用修改后的字典.

import difflib

names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John',
    'Acacia koa A.Gray var. waianaeensis H.St.John',
    'Acacia koaia Hillebr.',
    'Acacia kochii W.Fitzg. ex Ewart & Jean White',
    'Acacia kochii W.Fitzg.']
s = 'Acacia kochi W.Fitzg.'

# base case: proper capitalisation
print(difflib.get_close_matches(s,names,1,0.9))

# this should be equivalent from the perspective of my program
print(difflib.get_close_matches(s.upper(),names,1,0.9))

# this won't work because of the dictionary formatting
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9))
Run Code Online (Sandbox Code Playgroud)

输出:

['Acacia kochii W.Fitzg.']
[]
[]
Run Code Online (Sandbox Code Playgroud)

工作代码:

根据Hugh Bothwell的回答,我修改了如下代码以获得一个有效的解决方案(当返回多个结果时,它也应该有效):

import difflib

names = ['Acacia koa …
Run Code Online (Sandbox Code Playgroud)

python difflib

8
推荐指数
2
解决办法
3433
查看次数