Hide keyboard shortcuts

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 

5 

6 

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:]]) 

23 

24 for v in itertools.product(*args): 

25 yield "".join(map(str, v))