Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import ast
2import re
3import itertools
4from typing import Generator
7def list_expand(s: str) -> Generator[str, None, None]:
8 """
9 >>> list(list_expand("abc [1,2,3] def ['abc', 'def'] xyz")) # doctest:+ELLIPSIS
10 ['abc 1 def abc xyz', 'abc 1 def def xyz', ..., 'abc 3 def def xyz']
11 """
12 args = []
13 cur = 0
14 for i in re.finditer("\\[[^\\[\\]]*\\]", s):
15 st, en = i.span()
16 val = ast.literal_eval(s[st:en])
17 if cur < st:
18 args.append([s[cur:st]])
19 args.append(val)
20 cur = en
21 if cur < len(s):
22 args.append([s[cur:]])
24 for v in itertools.product(*args):
25 yield "".join(map(str, v))