2015-11-12 75 views
0

我需要一個正則表達式來趕......在以下兩種格式Python的正則表達式中綴計算器

() + - */

OR

數...

xxx.xxx 

IE 3.14159

xxx 

IE 42

我有...

re.findall('[+-/*//()]|\d+(\.\d+)?', noWhitespaces) 

下面的表達式...

(2.0 + 2.0)/1 

...是...產生

['', '.0', '', '.0', '', '', ''] 

,我不知道爲什麼。

我...在xxx格式,IE 1

re.findall('[+-/*//()]|\d+\.\d+', noWhitespaces) 

其中在xxx.xxx格式IE 2.0和運營商對數字的工作,但不是數字。

編輯:確切的代碼...

noWhitespaces = re.sub(r'\s+', '', s) 
print(noWhitespaces) 
tokens = re.findall(r'[-+/*//()]|\d+(\.\d+)?', noWhitespaces) 
print(tokens) 
+0

請將'-'放在字符類的開頭或末尾。否則它會被視爲從'+'到'/'的字符的_range_,其中包含',','-'和'.'。如果您使用了[RegEx101](http://regex101.com/),那麼您會立即看到這一點。 – Xufox

+0

[正則表達式只允許字母數字,逗號,連字符,下劃線和分號]的可能重複(http://stackoverflow.com/questions/9333325/regex-to-only-allow-alphanumeric-comma-hyphen-underscore-and-分號) – Xufox

+0

@Xufox不,它不是。 –

回答

2

只是使第二點部分可選的\d+\.\d+

>>> import re 
>>> s = '(2.0 + 2.0)/1' 
>>> re.findall(r'[-+/*()]|\d+(?:\.\d+)?', s) 
['(', '2.0', '+', '2.0', ')', '/', '1'] 

請注意,你需要做的捕獲組非捕獲組,因爲findall應首先優先捕獲。這就是爲什麼在輸出中得到.0,即捕獲組捕獲的字符串。

+0

我添加了其他正則表達式代碼。它真的不適合我 –

+0

使捕獲組成爲非捕獲組。 –

+0

Got it!謝謝! –