2016-10-10 6 views
-1

Я хочу, чтобы разделить строку, какРазбивает строку выражения

Expression = "((((324+17)*3)/((936-51)+124))-((13*(72-41))+6))" 

я использую str.split(), но это разделить число, как: "3 2 4 + 1 7"

выход:

"((((324 + 17) * 3)/((936 - 51) + 124)) - ((13 * (72 - 41)) + 6))" 
+1

Можете ли вы показать, какой результат вы надеетесь достичь? – CoryKramer

+1

Вопросы поиска справки по отладке («почему этот код не работает?») Должны включать ** желаемое поведение **, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См. [MCVE]. –

ответ

2

Я думаю, что вы должны вставлять пространство между любыми не числовыми символами. Split не сможет выполнить эту работу для вас, и вы можете использовать re.sub для этого же.

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

import re 
Expression = "((((324+17)*3)/((936-51)+124))-((13*(72-41))+6))" 
# Insert space after every non numeric characters 
str = re.sub("([^0-9])", r'\1 ', Expression).strip() 
#Insert space after numeric characters which are followed by non numeric characters 
str = re.sub("([0-9])([^0-9])", r'\1 \2', str).strip() 
print(str) 

Выход
((((324 + 17) * 3)/((936 - 51) + 124)) - ((13 * (72 - 41)) + 6))

+0

Я думаю, что вы поняли их намерения. –

+0

Если вы используете регулярное выражение, вы можете сделать его очень простым: '. '.join (re.findall (r' \ d + |. ', Expression))' – Blckknght

0

Вы могли используйте словарь для замены определенных символов их дополненными эквивалентами:

>>> Expression = "((((324+17)*3)/((936-51)+124))-((13*(72-41))+6))" 
>>> d = {'(':'(', ')':')', '+': ' + ', '-': ' - ', '*': ' * ', '/': '/'} 
>>> ''.join(d[c] if c in d else c for c in Expression) 
'((((324 + 17) * 3)/((936 - 51) + 124)) - ((13 * (72 - 41)) + 6))' 

Обратите внимание, что прописные словарные подставки ( с одним пространством вправо, ) с одним пространством влево и операторы с интервалом с обеих сторон. Это предотвращает переполнение с вложенными круглыми скобками.

0

Вы ищете tokenize строку. Для выражения Python вы можете сделать это, используя модуль tokenize, или для более простой формы вы можете использовать различные функции поиска. Вот два примера:

>>> expression = "((((324+17)*3)/((936-51)+124))-((13*(72-41))+6))" 

>>> import re 
>>> re.findall('[0-9]+|.', expression) 
['(', '(', '(', '(', '324', '+', '17', ')', '*', '3', ')', '/', '(', '(', '936', '-', '51', ')', '+', '124', ')', ')', '-', '(', '(', '13', '*', '(', '72', '-', '41', ')', ')', '+', '6', ')', ')'] 

>>> import tokenize 
>>> [t.string for t in tokenize.tokenize(iter([expression.encode('utf-8')]).__next__) 
... if t.type not in (tokenize.ENCODING, tokenize.ENDMARKER)] 
['(', '(', '(', '(', '324', '+', '17', ')', '*', '3', ')', '/', '(', '(', '936', '-', '51', ')', '+', '124', ')', ')', '-', '(', '(', '13', '*', '(', '72', '-', '41', ')', ')', '+', '6', ')', ')'] 

iter([bytes]).__next__ часть требуется, потому что токенизировать обычно читает из файлов, а не ярлык для одной строки.

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