2016-09-15 9 views
1

У меня есть длинный список numberseries отформатированных как это:Как я могу легко обрабатывать числовые элементы, созданные с помощью скобок?

["4450[0-9]", "6148[0-9][0-9]"] 

Я хочу, чтобы сделать список из одной из этих серий с одиночными номерами:

[44500,44501,..., 44509] 

я должен сделать это для многих серий в исходном списке, и мне интересно, что лучший способ для этого?

+0

Я надеюсь, что есть некоторый Python модуль, который делает это вместо меня ныряя глубоко в регулярное выражение или этажерки – sousys

ответ

2

Вероятно, не самое лучшее решение, но вы можете подойти рекурсивно ищет [x-y] диапазоны и значения generating (с использованием yield и yield from в этом случае, следовательно, для Python 3.3+):

import re 

pattern = re.compile(r"\[(\d+)-(\d+)\]") 

def get_range(s): 
    matches = pattern.search(s) 
    if not matches: 
     yield int(s) 
    else: 
     start, end = matches.groups() 
     for i in range(int(start), int(end) + 1): 
      repl = pattern.sub(str(i), s, 1) 
      yield from get_range(repl) 


for item in get_range("6148[0-9][0-9]"): 
    print(item) 

Печать:

614800 
614801 
... 
614898 
614899 
+0

, вероятно, лучше, чем мое решение: P явно хорошо думает с yeild: P –

+0

@JoranBeasley спасибо, мне нравится, как вы думаете об этом как «инвертировать re» :) – alecxe

+0

lol, чтобы быть справедливым RE очень сильно определен здесь: P as только соответствие оператору проблемы –

1
def invertRE(x): 
    if not x: 
     yield [] 
    else: 
     idx = 1 if not x.startswith("[") else x.index("]") + 1 
     for rest in invertRE(x[idx:]): 
      if x.startswith("["): 
       v1,v2 = map(int,x[1:idx-1].split("-")) 
       for i in range(v1,v2+1): 
        yield [str(i),]+rest 
      else: 
       yield [x[0],] + rest 

print(map("".join,invertRE("123[4-7][7-8]"))) 

Im уверен, что это будет работать ... но на самом деле вы должны попробовать что-то по своему усмотрению, прежде чем пришедшего сюда ...

0

Нашел этот модуль, который, кажется, делает то, что я хочу. Ответ

https://pypi.python.org/pypi/braceexpand/0.1.1

>>> from braceexpand import braceexpand 
>>> s = "1[0-2]" 
>>> ss = "1[0-2][0-9]" 
>>> list(braceexpand(s.replace("[", "{").replace("-","..").replace("]","}"))) 
['10', '11', '12'] 
>>> list(braceexpand(ss.replace("[", "{").replace("-","..").replace("]","}"))) 
['100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129'] 

alecxe по-прежнему «лучший» ответ, а не ярлык Тх