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

时间:2019-01-18 02:58:18

标签: 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)
            length += 1
        else:
            length = 0
            word = ''
        if length > 4:
            print(word)

该代码当前反复打印类似“ -----”和“ 55555”之类的字符串,并且似乎没有中断循环(这些特定的字符串仅在lp中出现一次)。我也不相信会找到不是只是重复相同字符的字符串。

如何将代码更改为:

  1. 仅使其运行并每次打印一次,并且
  2. 不仅发现重复的相同字符的字符串吗?

编辑:这是一些模拟文本文件。其中,字符串“ ghtyty”在file1中出现3次,在file2中出现4次。该代码应打印一次“ ghtyty”以进行控制台。

file1 file2

1 个答案:

答案 0 :(得分:5)

我建议采用另一种方法。将文件拆分为单词,并保留不超过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