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)