比较Python中的两个.txt文件并将精确和相似的匹配保存到.txt文件

比较Python中的两个.txt文件并将精确和相似的匹配保存到.txt文件,python,compare,pattern-matching,intersection,file-comparison,Python,Compare,Pattern Matching,Intersection,File Comparison,我需要的是: text_file_1.txt: apple orange ice icecream text_file_2.txt: apple pear ice 当我使用“设置”时,输出将为: apple ice (“相当于重新匹配”) 但我想得到: apple ice icecream (“相当于重新搜索”) 有没有办法做到这一点?文件很大,所以我不能只遍历它并使用正则表达式。您可能想签出您可能想签出如果您只想从文件中提取单词,这些单词是另一个的子字符串(包括那些相同的),您可以执行

我需要的是:

text_file_1.txt:
apple
orange
ice
icecream

text_file_2.txt:
apple
pear
ice
当我使用“设置”时,输出将为:

apple
ice
(“相当于重新匹配”)

但我想得到:

apple
ice
icecream
(“相当于重新搜索”)


有没有办法做到这一点?文件很大,所以我不能只遍历它并使用正则表达式。

您可能想签出

您可能想签出

如果您只想从文件中提取单词,这些单词是另一个的子字符串(包括那些相同的),您可以执行以下操作:

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])
# transforming to sets saves to check twice for the same combination

result = []
for wone in fone:
    for wtwo in ftwo:
        if wone.find(wtwo) != -1 or wtwo.find(wone) != -1:
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w
或者,如果您希望根据字符串在字母顺序上的相似性来确定相似性,您可以按照Paul在回答中的建议,使用difflib提供的一个类:

import difflib as dl

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])

result = []
for wone in fone:
    for wtwo in ftwo:
        s = dl.SequenceMatcher(None, wone, wtwo)
        if s.ratio() > 0.6:  #0.6 is the conventional threshold to define "close matches"
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w

我没有对两个示例中的任何一个进行计时,但我想第二个示例的运行速度会慢得多,因为对于每对示例,您都必须实例化一个对象…

如果您只想从文件中提取单词,而这些单词是另一个的子字符串(包括相同的子字符串),您可以执行以下操作:

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])
# transforming to sets saves to check twice for the same combination

result = []
for wone in fone:
    for wtwo in ftwo:
        if wone.find(wtwo) != -1 or wtwo.find(wone) != -1:
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w
或者,如果您希望根据字符串在字母顺序上的相似性来确定相似性,您可以按照Paul在回答中的建议,使用difflib提供的一个类:

import difflib as dl

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])

result = []
for wone in fone:
    for wtwo in ftwo:
        s = dl.SequenceMatcher(None, wone, wtwo)
        if s.ratio() > 0.6:  #0.6 is the conventional threshold to define "close matches"
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w


我没有对这两个示例中的任何一个进行计时,但我想第二个示例的运行速度会慢得多,因为对于每两个示例,您都必须实例化一个对象…

要格式化文本,请使用SO的标记语法(编辑时查看页面右侧,应弹出一个帮助),而不是HTML标记。:)如果您只希望B中的所有单词都以a中的一个单词开头:
{B代表输入中的B_2,如果有的话(a.startswith(B)代表输入中的a_1}
。这将是O(n^2)。否则,您是否可以发布希望运行但速度太慢的代码?那么我们至少可以理解您正在尝试执行的操作。要格式化文本,请使用SO的标记语法(编辑时查看页面右侧,应该会弹出一个帮助),而不是HTML标记。:)如果您只希望B中的所有单词都以a中的一个单词开头:
{B代表输入中的B_2(如果有)(a.startswith(B)代表输入中的a_1}
。这将是O(n^2)。否则,您可以发布您希望运行但速度太慢的代码吗?这样我们至少可以了解您正在尝试执行的操作。如果您将嵌套for循环替换为itertools.product:
itertools.product(fone,ftwo)中的wone,wtwo:
@Paul-是的,我自己也这么想,但我的印象是(但我没有分析代码)95%的时间将花在
str.find()
上,而不是在循环中,所以我认为这是一个过早的优化(=徒劳)。不过,我可能错了,唯一的方法是给它们计时!:)是的,我通常不会落入过早优化的陷阱,但嵌套循环总是(总是)这是我的一个小问题,自从我学会C++以来,当我拿起Python发现itertools.product时,我倾向于去它而不是嵌套的循环。对于每次通过循环实例化<代码> SequenceMatcher < /Cord>对象的问题,我很好奇这是否会更有效:如果你还感兴趣的话,我有测试代码和结果。长话短说,更新单个对象在1000000次迭代后大约快20秒,这并不奇怪。什么让我惊讶使用itertools.product一点也不快:-/如果用itertools.product:
for wone,itertools.product(fone,ftwo)中的wtwo替换嵌套for循环,效率会更高:
@Paul-是的,我自己也这么想,但我有这样的印象(但我没有分析代码)95%的时间将花在
str.find()
,而不是循环上,所以我认为这是一个过早的优化(=徒劳)。虽然我可能错了,唯一的方法就是给它们计时!:)是的,我通常不会落入过早优化的陷阱,但嵌套循环一直(一直)是我最讨厌的,自从我学习C++以来,当我拿起Python并找到itertools.product时,我倾向于去它而不是嵌套的循环。对于每次通过循环实例化<代码> SequenceMatcher < /Cord>对象的问题,我很好奇这是否会更有效:我现在正在设置一些脚本来测试这一点。如果您仍然感兴趣,我在上有测试代码和结果。长话短说,更新单个对象在1000000次迭代后大约快20秒,这并不令人惊讶。(对我来说)令人惊讶的是,使用itertools.product一点也不快:-/你能告诉我difflib的哪个函数是最好的吗?@Mephian:在你定义“相似匹配”是什么意思之前,不可能回答这个问题。例如,标准的
ratio()
函数将不会返回您要求的列表(请在我的答案中尝试代码,以便您自己检查)。@mac在其编辑的答案中对此做了详细说明。你也许应该给他一个“公认的答案”@Paul-真正的运动精神![虽然我认为除非你先编辑你的答案,否则他不会,但我相信这是有时间限制的]。不幸的是,我今天的选票用完了。。。不过明天我会给你+1的答案!:)@麦克:我所说的相似匹配是指词根相同的单词。像“ice”-“icecream”或“icecream”-“StrawberryiceStream”,我在每个文件中都提到了数以百万计的单词。你能告诉我difflib的哪个函数是最好的吗?@Mephian:在你定义“相似匹配”是什么意思之前,不可能回答这个问题。例如,标准的
ratio()
函数将不会返回您要求的列表(请在我的答案中尝试代码,以便您自己检查)。@mac在其编辑的答案中对此做了详细说明。你也许应该给他一个“公认的答案”@Paul-真正的运动精神![虽然我不认为他能,除非你先编辑你的答案,