【问题标题】:How to match multiple instance with the same pattern in a matching using python如何使用python在匹配中匹配具有相同模式的多个实例
【发布时间】:2012-07-08 12:20:14
【问题描述】:

以下面的字符串为例,

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

我想提取这样的键值对:

matchobj['Obsoletes'] = 'RFC0011'

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

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

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

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

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

【问题讨论】:

    标签: python regex


    【解决方案1】:

    你可以得到(...)的部分,并用大写的单词拆分它们来解决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)
    

    【讨论】:

      【解决方案2】:
      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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多