Q:

How do you split by continuous spaces when some entries have need to be split from a different location

I have the following and I'm trying to split it into Key: Value dictionary where the key is the protocol+version and the value is whether it's supported or not. 
['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)']

My problem is that I can't figure out a neat way to split this, I can't split by tabs since the data uses spaces, and I can't split by space because some protocols have space there as well. Example:
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)']]

As you can see they all work mostly ok except for some protocols like: ['ALPN/HTTP2', 'h2, http/1.1 (offered)']
This is what the original data looks like:
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)

And I want my final output to look like this:
{
    '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)'
}

A:

You may use the following regex with re.findall:
^(\S+(?:\s+\d+(?:\.\d+)*)?)\s+(.*)

See the regex demo. Details:

^ - start of string
(\S+(?:\s+\d+(?:\.\d+)*)?) - Group 1: 

\S+ - 1+ non-whitespace chars
(?:\s+\d+(?:\.\d+)*)? - an optional non-capturing group matching 1+ whitespaces, 1+ digits and then 0+ occurrences of . and 1+ digits

\s+ - 1+ whitespaces
(.*) - Group 2: the rest of the line/string.

See the Python demo:
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())) )

Output:
{'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)'}

