1

以以下字符串为例,

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

我想提取这样的键值对:

matchobj['Obsoletes'] = 'RFC0011'

matchobj['更新者'] = ['RFC0036', 'RFC0047']

matchobj['状态'] = '未知'

我该怎么做?注意:不是所有的括号都是强制的,比如不能出现'(Obsoletes RFC0011)'

我的考虑是:首先,用括号对拆分整个字符串,然后从每个括号对中提取。为此,我必须使用 for 或 while 语句匹配括号,但我想知道 Python 中是否有一种方法可以在匹配中匹配具有相同模式的多个实例,它是,我可以从作为列表或数组

也许有更好的方法来实现这一点,我主要是 python 和正则表达式,如果有人给我一些建议?非常感谢!

4

2 回答 2

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)
于 2012-07-08T03:43:07.573 回答
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 
于 2012-07-08T03:52:14.923 回答