2012-07-08 39 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