2011-03-25 44 views
2

我有一個這樣的查詢字符串查詢字符串中的所有詞/詞組:Python的正則表達式:發現含有或和與

s = 'word1 AND word2 word3 OR "word4 word5" OR word6 AND word7 word8' 

我需要找到內或和與所有的單詞或短語,這樣的結果將是像這樣的列表(最好不AND/OR和詞/短語之間的空格):

l = ['word1', 'word2 word3', '"word4 word5"', 'word6', 'word7 word8'] 

我試着用正則表達式瞎搞,但便無法找到一個方法來做到這一點。

感謝您的幫助。

回答

6

如果你想使用正則表達式,重。拆分應該這樣做:

re.split(' OR | AND ', 'word1 AND word2 word3 OR "word4 word5" OR word6 AND word7 word8') 
['word1', 'word2 word3', '"word4 word5"', 'word6', 'word7 word8'] 

如果你需要更大的錘子,你可以看看pyparsing: http://pyparsing.wikispaces.com/file/view/searchparser.py

+0

謝謝。那是我正在尋找的答案。以某種方式忘了re.split。 :) – 2011-03-25 04:31:26

+0

+1爲pyparsing ref。只分開AND和OR就放棄它們的單獨語義(AND和OR不是同義詞),忽略優先級(「X AND Y OR Z」不同於「X AND(Y OR Z)」)。 pyparsing wiki有幾個例子可供參考:http://pyparsing.wikispaces.com/file/view/simpleBool.py和http://pyparsing.wikispaces.com/file/view/sea​​rchparser.py。這些例子也被擴展到他們自己的項目Booleano和Whoosh。 – PaulMcG 2011-03-25 13:08:12

+0

對於我的特殊問題,沒有必要知道它是「AND」還是「OR」。我只需要查詢中的單詞,與語義無關。 – 2011-04-29 02:26:08

1

IMO應改用

s.split(' AND ') 
s.split(' OR ') 

,或者如果間距是不規則的,使用

s.split('AND') 
s.split('OR') 

然後循環和.strip()每個元素

+0

Thx。雖然我真的想找到一個正則表達式。這不是我第一次需要的東西。像這樣(這次我只是沒有找到滿足我的工作)。除了OR和AND作爲分隔符之外,可能還有更復雜的事情。 – 2011-03-25 04:21:24

+0

夠公平的。儘管要記住「正確的工作使用正確的工具」這句格言。擁有「全面解決方案」的解決方案最好是矯枉過正,最壞的情況是難以維護。另外,根據一般的經驗法則,使用正則表達式應該始終是最後的解決方案。這是一個非常強大的工具,但像這樣的內置函數通常總是更高效且更具可讀性。 – 2011-03-25 04:27:10

+0

當然。再次感謝您的幫助。我會考慮你對這個特定任務的評論。 – 2011-03-25 04:30:35