2014-12-24 70 views
0

我想在python中寫一個正則表達式,可以返回我組相似的模式。下面是一些樣本輸入 -無法制定與循環模式的正則表達式

  • class:('MF YY' or 'XX') and status:('Active' or 'Pending')
  • class:('MF YY' or 'XX') and status:('Active' or 'Pending') and available:1
  • available:1
  • available:1 or class:('MF YY' or 'XX' or 'YY') * status:'Pending'

而且很多這樣的組合。我想輸出將在下面的格式 -
輸入:class:('MF YY' or 'XX' or 'YY') and status:('Active' or 'Pending') or available:1
輸出:

group 1: class:('MF YY' or 'XX' or 'YY') 
group 2: and 
group 3: status:('Active' or 'Pending') 
group 4: or 
group 5: available:1 

這是我寫的正則表達式 -

(\w*\:\(.*?\))(?:\s*(and|or)*\s*) 

這將返回我 -

group 1: class:('MF YY' or 'XX') 
group 2: and 

我正則表達式改變 -

(\w*\:\(.*?\))(?:\s*(and|or)*\s*)+(\w*\:\(.*?\)) 

返回 -

group 1: class:('MF YY' or 'XX') 
group 2: and 
group 3: status:('Active' or 'Pending') 

但是,如果添加了更多的表達我的方法上面沒有可擴展性。我嘗試添加*/+進行重複發佈,但這並不奏效。

如何實現重複模式,3種類型 -

  1. 領域:( '{}東西' 和/或{}的東西......)
  2. 字段:{}東西
  3. 和/或結合這些較小表達式的運營商

在此先感謝您提供的所有幫助。

+0

沒有擴展的解決方案,可以捕獲在一個單獨的捕獲組的一切 - 除非你編寫代碼來生成正則表達式。爲什麼不重複將相同的模式應用於輸入,直到找到所有匹配? –

回答

0

我將各自使用或操作者(|)捕獲:

\w+:\([^)]+\)|\w+:'[^']+'|\w+:\S+|(?:and|or) 

第一部分\w+:\([^)]+\)獲取field:('{something}' and/or {something} ...)

第二部分\w+:'[^']+'得到field:'{something}'

第三部分\w+:\S+得到field:{something}

最後一部分獲得運營商。

正則表達式從左到右工作,以便在嘗試匹配第二,第三,第四等部分之前始終檢查第一部分。

使用上面的re.findall可以獲得每場比賽的列表。

ideone demo