2012-07-08 38 views
1

考慮下面的字符串作爲例子匹配,如何將多個實例與匹配相同的模式使用python

str = '(Obsoletes RFC0011) (Updated by RFC0036, RFC0047) (Status: UNKNOWN)' 

我想提取這樣的鍵值對:

matchobj [」淘汰了 '] = 'RFC0011'

matchobj [' 通過更新 '] = [' RFC0036' , 'RFC0047']

matchobj [ '狀態'] = '未知'

我該怎麼辦?注:並非所有括號都是強制性的,如'(Obsoletes RFC0011)'不能出現

我的考慮因素是: 首先,用括號對分割整個字符串,然後從每個括號對中提取。要做到這一點,我必須使用for或while語句來匹配括號,但是我想知道是否在Python中有一種方式來匹配多個實例與匹配中的相同模式,它是,我可以訪問匹配結果作爲列表或數組

也許有更好的方法來實現這一點,我主要的python和正則表達式,如果有人給我一些建議? 非常感謝!

回答

2

您可以獲得(...)零件並將它們拆分爲大寫字母以解決Updated by這個問題。

>>> s = '(Obsoletes RFC0011) (Updated by RFC0036, RFC0047) (Status: UNKNOWN)' 
>>> data = [re.split(',?:?\s(?=[A-Z])',i) for i in re.findall(r'\((.*?)\)',s)] 
>>> dic = {d[0]:d[1:] for d in data} 
>>> dic 
{'Status': ['UNKNOWN'], 
'Obsoletes': ['RFC0011'], 
'Updated by': ['RFC0036', 'RFC0047']} 

如果需要,您可以僅使用一個元素優化參數。

如果你的Python比2.7年紀大了,使用方法:

dict((d[0],d[1:]) for d in data) 
0
from re import split 

splitted = split(r'\)\s\(', "(Obsoletes RFC0011) (Updated by RFC0036, RFC0047) (Status: UNKNOWN)") 

obsoletes, updatedby, unknown = [[j for j in split(r'[\s,]', i) if "RFC" in j] for i in splitted] 


matchobj = {"Obsoletes" : obsoletes, "UpdatedBy" : updatedby, "Unknown" : unknown} 

print matchobj