【问题标题】:Python Regex match string between specific string and end characterPython Regex匹配特定字符串和结束字符之间的字符串
【发布时间】:2015-03-23 05:41:20
【问题描述】:

我正在构建一个文件剥离器来构建配置报告,并且我有一个非常长的字符串作为我的基本数据。以下是其中的一个非常小的 sn-p,但它至少说明了我正在使用的内容。

片段示例:DEFAULT_GATEWAY=192.168.88.1&DELVRY_AGGREGATION_INTERVAL0=1&DELVRY_AGGREGATION_INTERVAL1=1&DELVRY_SCHEDULE0=1&DELVRY_SNI0=192.168.88.158&DELVRY_USE_SSL_TLS1=0&

我将如何匹配以下内容:

between "DEFAULT_GATEWAY=" and "&"
between "DELVRY_AGGREGATION_INTERVAL0=" and "&"
between "DELVRY_AGGREGATION_INTERVAL1=" and "&"
between "DELVRY_SCHEDULE=" and "&"
between "DELVRY_SNI0=" and "&"
between "DELVRY_USE_SSL_TLS1=" and "&"

并用它构建一个字典:

{"DEFAULT_GATEWAY":"192.168.88.1",
 "DELVRY_AGGREGATION_INTERVAL0":"1",
 "DELVRY_AGGREGATION_INTERVAL1":"1",
 "DELVRY_SCHEDULE0":"1",
 "DELVRY_SNI0":"0",
 "DELVRY_USE_SSL_TLS1":"0"}

?

【问题讨论】:

    标签: python regex match


    【解决方案1】:

    这是一种方法。

    In [1]: input = 'DEFAULT_GATEWAY=192.168.88.1&DELVRY_AGGREGATION_INTERVAL0=1&DELVRY_AGGREGATION_INTERVAL1=1&DELVRY_SCHEDULE0=1&DELVRY_SNI0=192.168.88.158&DELVRY_USE_SSL_TLS1=0&'
    
    In [2]: input.split('&')
    Out[2]: 
    ['DEFAULT_GATEWAY=192.168.88.1',
     'DELVRY_AGGREGATION_INTERVAL0=1',
     'DELVRY_AGGREGATION_INTERVAL1=1',
     'DELVRY_SCHEDULE0=1',
     'DELVRY_SNI0=192.168.88.158',
     'DELVRY_USE_SSL_TLS1=0',
     '']
    
    In [3]: [keyval.split('=') for keyval in input.split('&') if keyval]
    Out[3]: 
    [['DEFAULT_GATEWAY', '192.168.88.1'],
     ['DELVRY_AGGREGATION_INTERVAL0', '1'],
     ['DELVRY_AGGREGATION_INTERVAL1', '1'],
     ['DELVRY_SCHEDULE0', '1'],
     ['DELVRY_SNI0', '192.168.88.158'],
     ['DELVRY_USE_SSL_TLS1', '0']]
    
    In [4]: dict(keyval.split('=') for keyval in input.split('&') if keyval)
    Out[4]: 
    {'DEFAULT_GATEWAY': '192.168.88.1',
     'DELVRY_AGGREGATION_INTERVAL0': '1',
     'DELVRY_AGGREGATION_INTERVAL1': '1',
     'DELVRY_SCHEDULE0': '1',
     'DELVRY_SNI0': '192.168.88.158',
     'DELVRY_USE_SSL_TLS1': '0'}
    

    注意事项

    1. 这是输入行
    2. & 拆分以获得键值对。注意最后一项是空的
    3. 用等号分割每个条目,同时丢弃空条目
    4. 建立字典

    另一种解决方案

    In [8]: import urlparse
    
    In [9]: urlparse.parse_qsl(input)
    Out[9]: 
    [('DEFAULT_GATEWAY', '192.168.88.1'),
     ('DELVRY_AGGREGATION_INTERVAL0', '1'),
     ('DELVRY_AGGREGATION_INTERVAL1', '1'),
     ('DELVRY_SCHEDULE0', '1'),
     ('DELVRY_SNI0', '192.168.88.158'),
     ('DELVRY_USE_SSL_TLS1', '0')]
    
    In [10]: dict(urlparse.parse_qsl(input))
    Out[10]: 
    {'DEFAULT_GATEWAY': '192.168.88.1',
     'DELVRY_AGGREGATION_INTERVAL0': '1',
     'DELVRY_AGGREGATION_INTERVAL1': '1',
     'DELVRY_SCHEDULE0': '1',
     'DELVRY_SNI0': '192.168.88.158',
     'DELVRY_USE_SSL_TLS1': '0'}
    

    【讨论】:

    • 打败我......很好。我很晚才看到这个问题,我几乎写完了这个确切的解决方案。
    • 这次我很幸运。通常,我玩游戏很晚
    • 完美优雅的解决方案。谢谢!这不仅为我提供了我想要的特定键值对,还为我提供了配置中的全部对,以便于使用。
    【解决方案2】:
    import re
    
    keys = {"DEFAULT_GATEWAY",
        "DELVRY_AGGREGATION_INTERVAL0",
        "DELVRY_AGGREGATION_INTERVAL1",
        "DELVRY_SCHEDULE0",
        "DELVRY_SNI0",
        "DELVRY_USE_SSL_TLS1"}
    resdict = {}
    for k in keys:
        pat = '{}([^&])&'.format(k)
        mo = re.search(pat, bigstring)
        if mo is None: continue  # no match
        resdict[k] = mo.group(1)
    

    如果bigstring 是您要搜索的字符串,则将您想要的结果留在resdict

    这假设您事先知道要查找哪些密钥,并将它们保存在一组 keys 中。如果您事先不知道感兴趣的密钥,那当然是一个非常不同的问题。

    【讨论】:

      【解决方案3】:

      先用'&'分割得到一个字符串列表,然后用'='分割,像这样:

      d = dict(kv.split('=') for kv in line.split('&'))
      

      【讨论】:

      • 您缺少一张空条目检查。
      • 他刚刚发了一个sn-p,不清楚是否真的可以空条目。
      • 看其他答案,肯定是可以的。你所缺少的只是if kv
      • 仅仅因为他添加了检查并不意味着它是可能的,唯一的空条目是尾随的条目,这可能只是因为它是一个sn-p。
      猜你喜欢
      • 2020-11-13
      • 2010-11-04
      • 1970-01-01
      • 2010-11-22
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多