Это будет работать, используя itertools.groupby
z = ['z+2-44', '4+55+z+88']
print([["".join(x) for k,x in itertools.groupby(i,str.isalnum)] for i in z])
выход:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
Это просто группирует гольцов, если они буквенно-цифровой (или нет), просто присоединиться к ним обратно в список понимания.
EDIT: в общем случае калькулятор с круглыми скобками был задан в качестве последующего вопроса here. Если z
выглядит следующим образом:
z = ['z+2-44', '4+55+((z+88))']
затем с предыдущей группировке мы получаем:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+((', 'z', '+', '88', '))']]
Что не так легко разобрать с точки зрения лексем. Таким образом, изменение будет join
только если alphanum, и пусть в списке, если нет, уплощение в конце концов с помощью chain.from_iterable
:
print([list(itertools.chain.from_iterable(["".join(x)] if k else x for k,x in itertools.groupby(i,str.isalnum))) for i in z])
, который дает:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', '(', '(', 'z', '+', '88', ')', ')']]
(обратите внимание, что альтернативный регулярное выражение ответ может также быть адаптированы следующим образом: [re.findall('\w+|\W', s) for s in lst]
(обратите внимание на отсутствие +
после W
)
также "".join(list(x))
немного быстрее, чем "".join(x)
, но Я позволю вам добавить его, чтобы избежать изменения видимости этого уже сложного выражения.
Спецификация неполная, я думаю. Что относительно математических операторов * и /? Как насчет переменных a, b и c? Является ли pi константой, переменной или p * i? Заданный вопрос привлечет ответы, которые могут быть не очень полезны для всех ваших случаев. –
@martineau Я считаю, что вопрос [this] (http://stackoverflow.com/questions/4736/learning-regular-expressions) не является правильным дубликатом. – Kasramvd
@ Kasramvd: Мне было бы интересно услышать, почему вы так думаете. – martineau