2015-01-24 3 views
1

Я создаю стриптизерша для создания отчета о конфигурации, и у меня очень длинная строка в качестве базовых данных. Ниже приведен очень маленький фрагмент, но это, по крайней мере, иллюстрирует то, с чем я работаю.Python Regex соответствует строке между конкретной строкой и символом конца

Отрывок Пример: 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"} 

?

ответ

3

Вот как это сделать.

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. Split каждый элемент знак равенства, а выбрасывая пустые записи
  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'} 
+0

Ударьте меня в это ... Хорошо. Я видел этот вопрос поздно, и я почти сделал это точное решение. – Eithos

+0

Мне повезло на этот раз. Обычно, я довольно поздно в игре –

+0

Идеальное и элегантное решение. Благодаря! Это не только дало мне определенные пары ключевых значений, которые я хотел, но и все пары в конфигурации для удобства использования. – oorahduc

0

Split сначала «&», чтобы получить список строк, затем по '=', например:

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

Вам не хватает одной проверки пустых записей. – Amit

+0

Он просто разместил фрагмент, неясно, действительно ли возможны пустые записи. – Jared

+0

Посмотрите на другие ответы, это, безусловно, возможно. Все, что вам не хватает, это 'if kv'. – Amit

0
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) 

оставит свой желаемый результат в resdict, если bigstring является строка, которую вы ищете в.

Это предполагает, что вы заранее знаете, какие ключи вы будете искать, и вы храните их в наборе keys , Если вы заранее не знаете ключи, представляющие интерес, это, конечно, совсем другая проблема.

Смежные вопросы