我在一个文件夹中有一堆文件。我们假设我将所有转换为纯文本文件。
我想使用python执行这样的搜索:
query = '(word1 and word2) or (word3 and not word4)'
实际的logc变化,可以一起使用多个单词。另一个例子:
query = '(shiny and glass and "blue car")'
这些词也是由用户提供的,因此它们是变量。
我想显示匹配的句子和文件名。
这真的不需要像whoosh或haystack那样需要使用字段索引文件的复杂搜索引擎。
此外,这些工具似乎没有我上面解释的布尔查询。
我遇到了pdfquery
库,它完全符合我对pdfs的要求,但现在我需要它用于文本文件和xml文件。
有什么建议吗?
答案 0 :(得分:1)
说这个并不容易,但这并不容易。您正在尝试将不安全的字符串转换为可执行代码,因此您无法轻松使用{{ 1}}。这些不是文字,所以你也不能使用eval
。您需要编写一个词法分析器来识别ast.literal_eval
,AND
,NOT
,OR
和(
之类的内容,并将其视为除字符串以外的内容。最重要的是你显然需要处理复合布尔值,所以这比你想象的要困难得多。
你的问题是关于通过句子进行搜索,这不是Python的运作方式。您必须编写另一个词法分析器来逐句获取数据而不是按行。您需要大量阅读)
模块才能有效地执行此操作。我不知道该如何做到这一点,但基本上你会循环,同时有数据循环,每次迭代读取一个缓冲区,当你到达io
然后你必须通过一组列表推导来运行你的第一个查询词法分析器结果,每个列表推导都运行文件词法分析器的结果。
答案 1 :(得分:0)
我真的需要这样的解决方案,所以我创建了一个名为toned
的python包我希望它对其他人也有用。
答案 2 :(得分:0)
也许我回答这个问题为时已晚,但是我认为解决复杂的布尔搜索表达式的最佳方法是使用this implementation of Pyparsing
您可以在其说明中看到所有这些情况:
SAMPLE USAGE:
from booleansearchparser import BooleanSearchParser
bsp = BooleanSearchParser()
text = u"wildcards at the begining of a search term "
exprs= [
u"*cards and term", #True
u"wild* and term", #True
u"not terms", #True
u"terms or begin", #False
]
for expr in exprs:
print bsp.match(text,expr)
#non-western samples
text = u"안녕하세요, 당신은 어떠세요?"
exprs= [
u"*신은 and 어떠세요", #True
u"not 당신은", #False
u"당신 or 당", #False
]
for expr in exprs:
print bsp.match(text,expr)
它允许通配符,文字且不能根据需要嵌套在多个括号中进行搜索。