Python Regex在特定字符串和结束ch之间匹配字符串

2024-10-01 15:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个文件剥离器来构建一个配置报告,我有一个非常长的字符串作为我的基础数据。下面是一个非常小的片段,但它至少说明了我正在使用的内容。你知道吗

代码片段示例: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 "&"

用它来构建一个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"}

什么?你知道吗


Tags: and文件defaultssluse报告betweengateway
3条回答
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。如果你事先不知道感兴趣的钥匙,那当然是完全不同的问题。你知道吗

首先按“&;拆分”以获得字符串列表,然后按“=”拆分,如下所示:

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

这里有一个方法。你知道吗

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

相关问题 更多 >

    热门问题