2016-11-04 102 views
0

我已經通過WiktorStribiżew的建議解決了這個問題。Python正則表達式點字符

已編輯:我只需要一次提取列表的第一個元素,因爲我需要對該數字執行其他操作。我在我的代碼中使用了一個循環來進行測試。

我想將算術表達式拆分爲數字列表。

例如:1 + 0.2(3^4)* 5 - > [ '1', '0.2', '3', '4', '5']

我使用重新庫在Python中,但表達式是用點符號''分割的。雖然我不包括'。'在delmiters。

即,當輸入是1 + 0.2,則輸出將是[ '1', '0', '2'],這應該是[ '1', '0.2']

的代碼是如下:

#!/bin/python 
import re 

delims = re.compile(r"[+-/*///^)]") 

while True: 
    string = input() 
    res = list() 
    i = 0 
    while i < len(string): 
     if string[i] >= '0' and string[i] <= '9': 
      num_str = delims.split(string[i:], 1)[0] 
      res.append(num_str) 
      i += len(num_str) - 1 
     i += 1 
    print(res) 

我非常感謝這個問題的任何意見!

+1

'-'創建一個範圍,轉義或移動到char類的結尾/開始處,使用'[ - +/* ^)]' –

+0

[Here](http://stackoverflow.com/questions/32324595/error-in-regex-to-catch-special-characters/32324646#32324646)是一個類似的問題。 –

+0

非常感謝!你太聰明瞭! –

回答

0

你的方法不起作用的原因是你創建了一個包含點的+-/的字符範圍。我也認爲你是過於複雜的事情。

import re 
str = '1+0.2-(3^4)*5' 
res = re.split(r'[-+()/*^]+', str) 
print(res) 

將輸出['1', '0.2', '3', '4', '5']

請注意,這種做法將不能正確處理負數。

+0

感謝您收到關於負數的通知! –

0

用下面的辦法與re.findall功能:

num_str = '1+0.2-(3^4)*5' 
numbers = re.findall(r'\d(?=[^.]|$)|\d+\.\d+', num_str) 

print(numbers) 

輸出:

['1', '0.2', '3', '4', '5'] 
0

如果你只是想只提取正整數,請嘗試以下。香港專業教育學院認爲是在simbols和數字之間的空格:

[int(s) for s in str.split() if s.isdigit()] 

這比正則表達式的例子有三個原因更好: 你不需要另一個模塊, 這是更具可讀性,因爲你不需要解析正則表達式迷你語言和 它更快。

+0

你確定這是足夠的,將工作? –

+0

是的,如果你不想區分正數和負數,它就可以工作。我認爲這種單線解決方案更適合使用正則表達式並重新發明輪子。 –

+1

即使字符串中的數字和符號沒有用空格「'」分隔嗎? –