The problem you have with your regex is that you consume the second SECTION. Once the first SECTION is found, the lazy dot matching construct consumes as few characters as possible up to the next SECTION, and the match returned contains the two words and all in between. Thus, having 4 SECTIONs, you can only get two matches.
This can be solved with a regex two ways (see demo of all 3 regexps below at IDEONE).
Lazy dot matching with a lookahead (less efficient, not recommended)
print(re.findall(r"SECTION.*?(?=$|SECTION)", text, re.DOTALL))
When the regex engine finds the first SECTION it starts consuming characters checking for the end of string ($) or leftmost SECTION.
Unroll-the-loop method to replace the lazy quantifier (much more efficient, requires no DOTALL modifier to match newline symbols)
print(re.findall(r"SECTION[^S]*(?:S(?!ECTION)[^S]*)*", text))
Here, no lazy quantifier or lookahead with alternatives are necessary since the SECTION consumes the first SECTION substring, and then [^S]*(?:S(?!ECTION)[^S]*)* matches any substring that is not equal to SECTION (up to the next SECTION if present, or just anything else up to the end of string).
A safer similar expression that makes sure there is whitespace and digits followed by a dot after SECTION:
print(re.findall(r"SECTION\s+\d+\.[^S]*(?:S(?!ECTION\s+\d+\.)[^S]*)*", text))
A regex explanation:
SECTION - matches SECTION literally
\s+ - 1 or more whitespace
\d+ - 1 or more digits
\. - literal dot
[^S]* - any character but S
(?:S(?!ECTION\s+\d+\.)[^S]*)* - 0 or more sequences of....
S(?!ECTION\s+\d+\.) - S that is not followed by ECTION + 1 or more whitespaces + 1 or more digits + a dot
[^S]* - any character but S
UPDATE
To obtain a dictionary in the form of {'SECTION 1' : '...', 'SECTION 2' : '...'}, you need to add 2 capturing groups around the key and value patterns, and then use the dict command. This works because re.findall returns tuples of captured texts if capturing groups (i.e. parentheses) are specified in the regex pattern (If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group.):
print(dict(re.findall(r"(SECTION\s+\d+)\.\s*([^S]*(?:S(?!ECTION\s+\d+\.)[^S]*)*)", text)))
See IDEONE demo
[SECTION, SECTION, SECTION, SECTION]}