2012-05-14 57 views
0

這是相當困難的描述(特別是作爲非母語的人),但我會盡我所能:多個不同的字符串的正則表達式匹配

在我的Python程序,我有,讓我們的數據庫比如新聞文章和希望瞭解其中一部分內容的用戶之一。 每個消息對象有多個字符串像作者標題文本

我想用戶的利益另存爲,讓我來匹配不同的字符串屬性和使用這樣的邏輯運算符組合這些比賽(語法並不重要)的表達式:然後

attribute author matches pattern (\w*\sSmith) and attribute text doesn't 
contain pattern (financ(e|ial)) 

,我必須爲每個用戶遍歷所有文章,如果表達式有效,請通知他/她。

我的問題是我真的不知道要使用什麼語言。我想避免創建我自己的解析器並編寫我自己的解析器(安全性,轉義等),因爲我確定這是一個相當普遍的問題,必須有比我更好的解決方案能夠創造。

我在網上搜索了一段時間,但還沒有找到任何東西。每一個幫助都非常感謝。提前致謝!

[編輯:]重新格式化爲RabbidRabbit建議的僞代碼。

+0

通過重新格式化爲純文本,我在一個碼塊意味着如圖http://stackoverflow.com/editing-help#syntax-highlighting。看看編輯歷史。我已經爲你編輯它。 – rabbidrabbit

+0

對不起,我很困惑。謝謝您的幫助! – camelNeck

回答

1

有幾種方法可以解決這個問題。它們的範圍從您以每個對象爲基礎應用於更復雜事物的元組列表(attribute, regexp)

一種選擇是找到某種聲明式「語言」,您可以使用該語言指定簡單查詢,例如您提到的那種查詢。這可能是存儲在JSON或YAML結構中的東西,這完全取決於你想要的複雜/可擴展性。

如果你希望它是真正可擴展的,你可能事件希望有一個DSL(領域特定語言):

http://www.slideshare.net/Siddhi/creating-domain-specific-languages-in-python

這裏是過去的StackOverflow後,可能會有幫助。

Writing a Domain Specific Language for selecting rows from a table

我可以看到(解析,生成和存儲)的最簡單的解決方法是元組,如一個LISP風格的前綴列表:

[('and', ('body', '.*to be or not.*'), ('author', (not, '.*shakespeare.*'))), 
...] 

如果你需要的是基本的布爾運營商和RegEx,這應該夠了。

[編輯]加入實施例

+0

好吧,我擔心編寫我自己的解析器,特別是爲DSL創建我自己的語法會導致巨大的混亂,給我留下比以前更多的問題:S關於可擴展性,我真的不需要超過那些屬性,正則表達式配對與And,Or和Not +小括號結合使用。請您詳細說明*在每個對象的基礎上*部分?我不是英語,不明白你的意思,對不起:S – camelNeck

+1

@camelNeck然後保持簡單,並使用元組列表或類似的東西。回答更新示例。 – ubik

+0

非常感謝,我會盡力! – camelNeck

相關問題