我在python中有一个文件名列表,如下所示:
HelloWorld.csv
hello_windsor.pdf
some_file_i_need.jpg
san_fransisco.png
Another.file.txt
A file name.rar
字符串
我正在寻找一个IntelliJ风格的搜索算法,您可以输入整个单词或简单的文件名中每个单词的第一个字母,或两者的组合。示例搜索:
hw -> HelloWorld.csv, hello_windsor.pdf
hwor -> HelloWorld.csv
winds -> hello_windsor.pdf
sf -> some_file_i_need.jpg, san_francisco.png
sfin -> some_file_i_need.jpg
file need -> some_file_i_need.jpg
sfr -> san_francisco.png
file -> some_file_i_need.jpg, Another.file.txt, A file name.rar
file another -> Another.file.txt
fnrar -> A file name.rar
型
你懂的。
有没有Python包可以做到这一点?理想情况下,它们还可以根据“频率”(文件被访问的频率,最近的时间)以及匹配的强度来对匹配进行排名。
我知道pylucene是一个选项,但它似乎非常重量级的文件名列表很短,我没有兴趣搜索文件的内容?有没有其他选择?
2条答案
按热度按时间u7up0aaq1#
你可以通过在python中使用正则表达式(import re)并创建函数来实现这一点。这有点复杂,但使用正则表达式可以实现。
字符串
我不知道你是否在寻找这样的东西或其他。
b1payxdu2#
要实现你想要的IntelliJ风格的模糊过滤器,我们应该首先用精确的语言定义它的预期行为:
1.对于每个文件名,将名称拆分为一个单词列表,拆分方式可以是非单词字符(因此
'hello_windsor.pdf'
变为['hello', 'windsor', 'pdf']
),也可以是后跟一个大写字母并在前面加上另一个单词字符的位置(因此'HelloWorld'
变为['Hello', 'World']
)。单词仅由字母和/或数字组成。单词列表应小写,以允许不区分大小写的匹配。1.将给定的查询字符串按空格分割成一个模式列表。所有模式都必须匹配一个名称才能被认为是匹配。
winds
中的字符w
匹配windstor
的第一个字符时,尝试将模式中的i
与windstor
中的i
进行匹配);sfr
中的字符s
匹配san francisco
中的san
的第一个字符但下一个字符f
不匹配san
中的a
时,尝试将f
与下一个单词francisco
中的f
匹配);file
不匹配another file
中的第一个单词another
,则尝试将file
与下一个单词file
匹配)。由于一个模式有多个可能的路径来匹配一个单词列表,我们可以用回溯算法来实现探索的行为:
字符串
以便:
型
产出:
型
演示:https://ideone.com/D1ITXQ
最后,要按上次访问时间对文件名进行排名,您可以按
os.path.getatime
以相反的顺序对列表进行排序:型