<p>可以使用正则表达式:</p>
<pre><code>import re
lotto = """
January:
[1, 11, 25, 37, 39, 47, 0]
[3, 13, 15, 18, 37, 46, 2]
[3, 6, 9, 12, 37, 46, 6]
February:
[3, 13, 15, 18, 37, 46, 0]
[1, 23, 17, 18, 37, 46, 8]
"""
def getMonthlyNumbers(month=None):
rx = re.compile(r'''
^{}:[\n\r]
(?P<numbers>(?:^\[.+\][\n\r]?)+)'''.format(month), re.M | re.X)
for match in rx.finditer(lotto):
# print it or do sth. else here
print(match.group('numbers'))
getMonthlyNumbers('January')
getMonthlyNumbers('February')
</code></pre>
<p/><hr/>
或者,对于所有月份,使用听写理解:
<pre><code>rx = re.compile(r'^(?P<month>\w+):[\n\r](?P<numbers>(?:^\[.+\][\n\r]?)+)', re.MULTILINE)
result = {m.group('month'): m.group('numbers') for m in rx.finditer(lotto)}
print(result)
</code></pre>
<p>这就产生了</p>
<pre><code>{'January': '[1, 11, 25, 37, 39, 47, 0]\n[3, 13, 15, 18, 37, 46, 2]\n[3, 6, 9, 12, 37, 46, 6]\n', 'February': '[3, 13, 15, 18, 37, 46, 0]\n[1, 23, 17, 18, 37, 46, 8]\n'}
</code></pre>
<p>这里的想法是在行首查找月份名称,然后捕获任何<code>[...]</code>对。见<a href="https://regex101.com/r/XJW9Ba/1" rel="nofollow noreferrer"><strong>a demo on regex101.com</strong></a>。
</p><hr/>
可能,您希望将每一行单独作为一个列表(而不是字符串),因此您可以选择:
<pre><code>import re
from ast import literal_eval
lotto = """
January:
[1, 11, 25, 37, 39, 47, 0]
[3, 13, 15, 18, 37, 46, 2]
[3, 6, 9, 12, 37, 46, 6]
February:
[3, 13, 15, 18, 37, 46, 0]
[1, 23, 17, 18, 37, 46, 8]
"""
rx = re.compile(r'^(?P<month>\w+):[\n\r](?P<numbers>(?:^\[.+\][\n\r]?)+)', re.MULTILINE)
result = {m.group('month'):
[literal_eval(numbers)
for numbers in m.group('numbers').split("\n") if numbers]
for m in rx.finditer(lotto)}
print(result)
</code></pre>