假设我有一个像这样的字符串:
st='''Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
Line 12
Line 13
Line 14'''
# may be really big...
现在假设我想要一个按空白行分组的LoL:
[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
['Line 5', 'Line 6'],
['Line 7', 'Line 8 ', 'Line 9'],
['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
我知道我可以使用正则表达式分割来创建LoL:
[[x] for x in re.split(r'^\s*\n',st,flags=re.MULTILINE)]
但是,我正在尝试使用非正则表达式Python生成器创建它。我得到的最接近的是这个可怕的东西(其中包括空白而且根本不知道......):
result=[]
for sub in (group for key, group in itertools.groupby(st.splitlines(), lambda x: not x.rstrip())):
result.append(list(sub))
print result
有关方向的任何提示吗?
我有点关键THIS SO question。
答案 0 :(得分:2)
这有什么理由不适合你吗?
>>> lol = [group.split("\n") for group in st.split("\n\n")]
>>> pprint(lol)
[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
['Line 5', 'Line 6'],
['Line 7', 'Line 8 ', 'Line 9'],
['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
答案 1 :(得分:2)
我可能会写
>>> grouped = itertools.groupby(map(str.strip, st.splitlines()), bool)
>>> [list(g) for k,g in grouped if k]
[['Line 1', 'Line 2', 'Line 3', 'Line 4'], ['Line 5', 'Line 6'],
['Line 7', 'Line 8', 'Line 9'], ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
这也将处理带有空格的空行,而基于\n\n
的分割则不会。另一方面,它不保留前导和尾随空格,这可能来自'Line 8 '
示例。如果重要,你可以这样做:
grouped = itertools.groupby(st.splitlines(), lambda x: bool(x.strip()))
(看着它,非常接近你已经在做的事情。)