Python 查找长度匹配的字符串>;4在两个文本文件之间
我试着读入两个文本文件,然后搜索两个文本文件之间共同的字符串,最小长度为5 我写的代码是: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
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
中出现一次)。我也不相信它能找到不只是重复同一个字符的字符串
如何将代码更改为:
我建议采用不同的方法。将文件拆分为单词,并仅保留单词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
将使用任何空格进行分割。这不是你定义单词的方式吗?我在原始帖子中添加了一些虚拟数据。