2015-05-12 5 views
1
example_string = "name[0]['subName'][0][1]" 

Я хотел бы список из подразделов строки и целых чисел между [и]найти все целые числа и вложенные строки между 2 символами

результатом будет

[0, 'subName', 0, 1] 

Я считаю re.findall() будет работать, но я не уверен, что будет regex

+1

Откуда «верх» пришел. Я бы ожидал 'subName' – inspectorG4dget

+1

Вы хотите оценить элементы на этом же шаге (выглядит так)? – kay

+3

это *** кричит *** XY мне. Что вы пытаетесь выполнить с помощью '[0, 'subName', 0, 1]'? –

ответ

7

re_results = re.findall("\[(.*?)\]",example_string) ... может работать для вас (если у вас нет вложенных скобок) ... Я подозреваю, что ключ, который вы отсутствовали, использовал жадные совпадения " [] «будет соответствовать как можно большему, поэтому он захватывает все: от первого открытого кронштейна до последнего закрытого кронштейна в виде единственного совпадения. «[.?]» Соответствует как можно меньше, при этом только один кронштейне пары за одной игрой

(вам нужно будет вручную отливать в целые числа, если тот, что вы на самом деле хотите)

вы могли бы сделать что-то простое как

def castIntOrDont(x): 
    try: 
     return int(x) 
    except ValueError: 
     return x.strip("'") #strip out the extra quotes on strings 

print map(castIntOrDont,re_result) #list(map(...)) in py3 
+4

Ваше регулярное выражение также вернет одинарные кавычки, что-то вроде' re.findall ("\ ['? (. *?)'? \]", Example_string) 'будет избегайте этого – JGreenwell

+2

или просто разделите их по методу пост-обработки: P (но да, очень хорошо, я просто забыл их изначально) –

4

Если вы знаете, что индексы либо выделены строки в кавычках или целые числа, которые можно использовать этот список понимание:

[ g[1:-1] if i else int(g) 
    for m in re.finditer(r"\[(?:(\d+)|('.*?'))\]", example_string) 
    for i, g in enumerate(m.groups()) if g is not None ] 

Все матчи м на входе:

for m in re.finditer(r"\[(?:(\d+)|('.*?'))\]", example_string) 

Для каждого матча: i=0 для целочисленного альтернативы или i=1 для струнного альтернативы:

for i, g in enumerate(m.groups()) if g is not None 

Газа котировки или бросить в целое число:

g[1:-1] if i else int(g) 
+2

+1 для явного разрешения только ожидаемого ввода ... однако вы отменяете значительное количество читаемости:/еще хороший ответ +1 –

Смежные вопросы