Как разделить на непрерывные пробелы, когда некоторые записи должны быть разделены из другого места - PullRequest
1 голос
/ 08 февраля 2020

У меня есть следующее, и я пытаюсь разбить его на словарь Key: Value, где ключ - это протокол + версия, а значение - поддерживается ли он или нет.

['SSLv2      not offered (OK)',
 'SSLv3      not offered (OK)',
 'TLS 1      not offered',
 'TLS 1.1    not offered',
 'TLS 1.2    offered (OK)',
 'TLS 1.3    not offered and downgraded to a weaker protocol',
 'NPN/SPDY   h2, http/1.1 (advertised)',
 'ALPN/HTTP2 h2, http/1.1 (offered)']

Моя проблема в том, что я не могу придумать, как правильно разделить это, я не могу разделить по вкладкам, так как данные используют пробелы, и я не могу разделить по пробелам, потому что некоторые протоколы там тоже есть место. Пример:

re.split(r'\s+', entries.strip(), 1)
['SSLv2', 'not offered (OK)'], ['SSLv3', 'not offered (OK)'], ['TLS', '1      not offered'], ['TLS', '1.1    not offered'], ['TLS', '1.2    offered (OK)'], ['TLS', '1.3    not offered and downgraded to a weaker protocol'], ['NPN/SPDY', 'h2, http/1.1 (advertised)'], ['ALPN/HTTP2', 'h2, http/1.1 (offered)']]

Как вы можете видеть, все они работают в основном нормально, за исключением некоторых протоколов, таких как: ['ALPN/HTTP2', 'h2, http/1.1 (offered)']

Вот как выглядят исходные данные:

SSLv2      not offered (OK)
SSLv3      not offered (OK)
TLS 1      not offered
TLS 1.1    not offered
TLS 1.2    offered (OK)
TLS 1.3    not offered and downgraded to a weaker protocol
NPN/SPDY   h2, http/1.1 (advertised)
ALPN/HTTP2 h2, http/1.1 (offered)

И я хочу, чтобы мой окончательный результат выглядел так:

{
    'SSLv2': 'not offered (OK)',
    'SSLv3': 'not offered (OK)',
    'TLS 1': 'not offered',
    'TLS 1.1': 'not offered',
    'TLS 1.2': 'offered (OK)',
    'TLS 1.3': 'not offered and downgraded to a weaker protocol',
    'NPN/SPDY': 'h2, http/1.1 (advertised)',
    'ALPN/HTTP2': 'h2, http/1.1 (offered)'
}

1 Ответ

2 голосов
/ 08 февраля 2020

Вы можете использовать следующее регулярное выражение с re.findall:

^(\S+(?:\s+\d+(?:\.\d+)*)?)\s+(.*)

См. Демонстрационную версию регулярного выражения . Подробности:

  • ^ - начало строки
  • (\S+(?:\s+\d+(?:\.\d+)*)?) - группа 1:
    • \S+ - 1+ непробельных символов
    • (?:\s+\d+(?:\.\d+)*)? - необязательная группа без захвата, соответствующая 1+ пробелам, 1+ цифрам и затем 0+ вхождениям . и 1+ цифрам
  • \s+ - 1+ пробелы
  • (.*) - Группа 2: остаток строки / строки.

См. Python демо :

import re

entries = ['SSLv2      not offered (OK)', 'SSLv3      not offered (OK)', 'TLS 1      not offered', 'TLS 1.1    not offered', 'TLS 1.2    offered (OK)', 'TLS 1.3    not offered and downgraded to a weaker protocol', 'NPN/SPDY   h2, http/1.1 (advertised)', 'ALPN/HTTP2 h2, http/1.1 (offered)']
for entry in entries:
    print( dict(re.findall(r'^(\S+(?:\s+\d+(?:\.\d+)*)?)\s+(.*)', entry.strip())) )

Выход:

{'SSLv2': 'not offered (OK)'}
{'SSLv3': 'not offered (OK)'}
{'TLS 1': 'not offered'}
{'TLS 1.1': 'not offered'}
{'TLS 1.2': 'offered (OK)'}
{'TLS 1.3': 'not offered and downgraded to a weaker protocol'}
{'NPN/SPDY': 'h2, http/1.1 (advertised)'}
{'ALPN/HTTP2': 'h2, http/1.1 (offered)'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...