Python正则表达式在特定字符串和结束字符之间匹配字符串

Python正则表达式在特定字符串和结束字符之间匹配字符串,python,regex,match,Python,Regex,Match,我正在构建一个文件剥离器来构建配置报告,我有一个非常长的字符串作为基础数据。下面是一个非常小的片段,但它至少说明了我正在处理的问题 代码片段示例:DEFAULT\u GATEWAY=192.168.88.1&DELVRY\u AGGREGATION\u INTERVAL0=1&DELVRY\u AGGREGATION\u INTERVAL1=1&DELVRY\u SCHEDULE0=1&DELVRY\u SNI0=192.168.88.158&DELVRY\u USE\u SSL\u TLS1=

我正在构建一个文件剥离器来构建配置报告,我有一个非常长的字符串作为基础数据。下面是一个非常小的片段,但它至少说明了我正在处理的问题

代码片段示例:
DEFAULT\u GATEWAY=192.168.88.1&DELVRY\u AGGREGATION\u INTERVAL0=1&DELVRY\u AGGREGATION\u INTERVAL1=1&DELVRY\u SCHEDULE0=1&DELVRY\u SNI0=192.168.88.158&DELVRY\u USE\u SSL\u 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 "&"
并用它构建一个dict,如:

{"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"}

?这里有一个方法

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'}
注释

  • 这是输入行
  • 拆分以获取键值对。注意,最后一个条目为空
  • 按等号拆分每个条目,同时丢弃空条目
  • 编字典
  • 另一个解决方案
    首先按“&”拆分以获得字符串列表,然后按“=”拆分,如下所示:

    d = dict(kv.split('=') for kv in line.split('&'))
    
    如果要搜索的字符串是
    bigstring
    ,则将在
    resdict
    中保留所需结果


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

    请告诉我。。。好的。我看到这个问题很晚了,我几乎写完了这个精确的答案。这次我很幸运。通常,我很晚才找到完美而优雅的解决方案。谢谢这不仅为我提供了我想要的特定键值对,还提供了配置中的全部键值对,以便于使用。您缺少一个空条目检查。他只是发布了一个片段,不清楚空条目是否确实可能。看看其他答案,这当然是可能的。如果kv
    ,您所缺少的只是
    。他添加了检查并不意味着这是可能的,唯一的空条目是尾随的条目,这可能只是因为它是一个片段。
    
    d = dict(kv.split('=') for kv in line.split('&'))
    
    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)