Python 查找长度匹配的字符串>;4在两个文本文件之间

Python 查找长度匹配的字符串>;4在两个文本文件之间,python,Python,我试着读入两个文本文件,然后搜索两个文本文件之间共同的字符串,最小长度为5 我写的代码是: db = open("list_of_2","r").read() lp = open("lastpass","r").read() word = '' length = 0 for dbchar in db: for lpchar in lp: if dbchar == lpchar: word += str(dbchar) l

我试着读入两个文本文件,然后搜索两个文本文件之间共同的字符串,最小长度为5

我写的代码是:

db = open("list_of_2","r").read()
lp = open("lastpass","r").read()

word = ''
length = 0

for dbchar in db:
    for lpchar in lp:
        if dbchar == lpchar:
            word += str(dbchar)
            length += 1
        else:
            length = 0
            word = ''
        if length > 4:
            print(word)
代码当前反复打印像“----”和“55555”这样的字符串,并且似乎没有中断循环(这些特定字符串只在
lp
中出现一次)。我也不相信它能找到不只是重复同一个字符的字符串

如何将代码更改为:

  • 仅使其贯穿并打印每个事件一次,并且
  • 不只是发现相同字符的字符串重复
  • 编辑:这里有一些模拟文本文件。其中,字符串“ghtyty”在file1中出现三次,在file2中出现四次。代码应该在控制台上打印一次“ghtyty”


    我建议采用不同的方法。将文件拆分为单词,并仅保留单词5个或更多字符。使用集合来查找交点--这样会更快

    db_words = set([x for x in db.split() if len(x) > 4])
    lp_words = set([x for x in lp.split() if len(x) > 4])
    
    matches = db_words & lp_words
    
    如果要排除所有相同字符的单词,可以如下定义列表理解:

    [x for x in db.split() if len(x) > 4 and x != x[0]*len(x)]
    

    如果要查找匹配的任何连续字符序列,这可能会更好:

    i_skip = set()  # characters to skip if they are already in a printed word
    j_skip = set()
    
    for i in range(len(db)-4):
        if i in i_skip: continue
        for j in range(len(lp)-4):
            if j in j_skip: continue
            if db[i] == lp[j]:
                word_len = 5
                while db[i:i+word_len] == lp[j:j+word_len]:
                    if db[i:i+word_len+1] == lp[j:j+word_len+1]:
                        word_len += 1
                    else:
                        print(db[i:i+word_len])
                        i_skip.update(range(i, i+word_len))
                        j_skip.update(range(j, j+word_len))
                        break
    

    我建议采用不同的方法。将文件拆分为单词,并仅保留单词5个或更多字符。使用集合来查找交点--这样会更快

    db_words = set([x for x in db.split() if len(x) > 4])
    lp_words = set([x for x in lp.split() if len(x) > 4])
    
    matches = db_words & lp_words
    
    如果要排除所有相同字符的单词,可以如下定义列表理解:

    [x for x in db.split() if len(x) > 4 and x != x[0]*len(x)]
    

    如果要查找匹配的任何连续字符序列,这可能会更好:

    i_skip = set()  # characters to skip if they are already in a printed word
    j_skip = set()
    
    for i in range(len(db)-4):
        if i in i_skip: continue
        for j in range(len(lp)-4):
            if j in j_skip: continue
            if db[i] == lp[j]:
                word_len = 5
                while db[i:i+word_len] == lp[j:j+word_len]:
                    if db[i:i+word_len+1] == lp[j:j+word_len+1]:
                        word_len += 1
                    else:
                        print(db[i:i+word_len])
                        i_skip.update(range(i, i+word_len))
                        j_skip.update(range(j, j+word_len))
                        break
    

    您能在两个文件中提供一小部分文本吗?很遗憾,没有。其中一个文件包含我的密码及其关联域。:)您可以发明一些模拟数据,使您能够提供一个完整的示例文件。无论如何,看看
    difflib
    模块(尤其是
    SequenceMatcher
    ),它在这里可能会有所帮助。字符串是否有特殊的特性,比如只作为空格分隔的单词?因为这会让生活变得更简单。你能在两个文件中提供一个小的文本样本吗?不幸的是,没有。其中一个文件包含我的密码及其相关域。:)您可以发明一些模拟数据,使您能够提供一个完整的示例文件。无论如何,看看
    difflib
    模块(尤其是
    SequenceMatcher
    ),它在这里可能会有所帮助。字符串是否有特殊的特性,比如只作为空格分隔的单词?因为这会让生活变得更简单。拆分不依赖于预定义的/已知的分隔符吗?不幸的是,两个文件的排列都不是很整齐,我正在寻找5个连续字符的匹配项。
    split
    将使用任何空格进行分割。这不是定义单词的方式吗?我在原始帖子中添加了一些虚拟数据。拆分不依赖于预定义的/已知的分隔符吗?不幸的是,两个文件的排列都不是很整齐,我正在寻找5个连续字符的匹配项。
    split
    将使用任何空格进行分割。这不是你定义单词的方式吗?我在原始帖子中添加了一些虚拟数据。