2017-02-19 15 views
2

В следующем виде: this question, у меня есть выражение, такое как: ['(', '44', '+(', '3', '+', 'll', '))'], которое было создано с помощью метода re.findall('\w+|\W+',item), однако в этом списке строк есть две ошибки. Один из них - «+ (», а другой - «))».Python - правильно израсходовать список рассылки

Есть ли пифонический способ, которым я мог бы разделить только операторов, чтобы список был чем-то вроде ['(', '44', '+','(', '3', '+', 'll', ')',')'].

(держать цифры/буквы вместе, отдельные символы)

Благодарности

+0

Это не дубликат, как _at all_. Это может показаться так, но я отредактировал вопрос, чтобы действительно показать, что хочет OP (после ответа на вопрос приквела) –

+0

проверить мой ответ, он отвечает на оба вопроса сейчас. –

ответ

1

Вы хотите разделить символы сгруппированных, не алфавитно-цифровых символов.

Я бы создал элемент из 1 списка, если элемент в порядке (буквенно-цифровой) или список символов, если элемент представляет собой последовательность символов.

Тогда, я бы придавить список, чтобы получить то, что вы просили

import itertools 

l = ['(', '44', '+(', '3', '+', 'll', '))'] 
new_l = list(itertools.chain.from_iterable([x] if x.isalnum() else list(x) for x in l)) 
print(new_l) 

результат:

['(', '44', '+', '(', '3', '+', 'll', ')', ')'] 

EDIT: на самом деле вы можете связать 2 вопроса в один ответ (адаптируя regex answer исходного вопроса), не группируя символы в регулярном выражении:

import re 
lst = ['z+2-44', '4+55+((z+88))'] 
print([re.findall('\w+|\W', s) for s in lst]) 

(примечание t он отсутствие + после \W), и вы получите сразу:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', '(', '(', 'z', '+', '88', ')', ')']] 
1

Короткое решение с использованием str.join() и re.split() функции:

import re 
l = ['(', '44', '+(', '3', '+', 'll', '))'] 
new_list = [i for i in re.split(r'(\d+|[a-z]+|[^\w])', ''.join(l)) if i.strip()] 

print(new_list) 

Выход:

['(', '44', '+', '(', '3', '+', 'll', ')', ')'] 
1

Альтернативой было бы к изменению регулярное выражение для сохранения отдельных букв и цифр:

import re 
lst = ['z+2-44', '4+(55+z)+88'] 
[re.findall('\w+|\W', s) for s in lst] 

#[['z', '+', '2', '-', '44'], ['4', '+', '(', '55', '+', 'z', ')', '+', '88']] 
1

Попробуйте это:

import re 
lst = ['z+2-44', '4+(55+z)+88'] 
[re.findall('\w+|\W', s) for s in lst] 

Может быть, это помогает другим.