2016-04-28 53 views
0

我有一堆文件在一個文件夾中。假設我將全部轉換爲純文本文件。蟒蛇 - 複雜布爾搜索文件中的單詞

我想使用Python這樣執行搜索:

query = '(word1 and word2) or (word3 and not word4)' 

實際logc變化,多個單詞可以一起使用。另一個例子:

query = '(shiny and glass and "blue car")' 

此外,單詞由用戶提供,所以他們是變量。

我想顯示匹配的句子和文件名。 這實際上並不需要像whoosh或乾草堆這樣的複雜搜索引擎,它們需要使用字段對文件進行索引。 另外,這些工具似乎沒有布爾查詢,正如我上面所解釋的。 我遇到過pdfquery庫,它完全符合我對pdf的要求,但是現在我需要它來獲取文本文件和xml文件。

有什麼建議嗎?

+0

是已知的安全性查詢嗎? 'eval'將在這裏提供一個簡單的輸出,但是如果這是用戶輸入,那麼它非常危險 –

+0

這個查詢是否應該用舊式搜索引擎式語義來解釋,其中'word'隱含意味着「'word」在文件」? – user2357112

+0

用戶可以鍵入單詞和語義(AND,OR,NOT,括號)。 – max

回答

0

我真的很需要有這樣的解決方案,所以我做了一個Python包稱爲​​

我希望這將是對別人有用的。

1

有沒有簡單的方法來說這個,但這並不容易。您正在嘗試將不安全的字符串轉換爲可執行代碼,因此您無法輕鬆解決並使用eval。這些不是文字,所以你也不能使用ast.literal_eval。您需要編寫一個詞法分析器,用於識別AND,NOT,OR,()之類的東西,並將它們視爲除字符串以外的內容。在上面你顯然需要處理複合布爾值,所以這比你想象的要困難得多。

您的問題通過搜索句子,這不是Python如何操作。你必須寫另一個詞法分析器來獲取數據的句子,而不是線。您需要大量閱讀io模塊纔能有效執行此操作。我不知道該怎麼做了手,但本質上你會被循環,同時有數據循環,讀緩衝區大小每次迭代,併產生當你達到一個"\.(?=\s+)"

那麼你就必須通過一系列列表解析來運行你的第一個查詢詞法分析器結果,每個列表解析都在文件詞法分析器的結果上運行。

+0

最後,你會希望你剛剛使用'awk' –

+0

awk沒有句子語義。 –

+0

@AdamSmith如果我將規格更改爲每行搜索而不是句子,該怎麼辦?這種情況是否有解決方案? – max