表達

2016-10-10 31 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__部分是必需的,因爲通常標記化讀出的文件,並沒有快捷方式的單一字符串。