2017-09-02 107 views
2

假設我有以下表達式:正則表達式:在表達式中提取數

"1+3x+52-9-45x+x" 

我的目標是,以提取所有的常數: [1,+ 52,-9]

我有使用Python嘗試:

re.findall("[+-]?\d+","1+3x+52-9-45x+x") 

結果是:

['1','+3','+52','-9','-45']

這是不正確的,因爲x的係數也被提取。

我也試過:

re.findall("[+-]?\d+[+-]?","1+3x+52-9-45x+x") 

但仍然沒有工作。

+0

你的sampe輸入中的「-3」在哪裏,你爲什麼不期望「-9」? – Yunnosch

回答

3

試試這個正則表達式:

(?:[+-])?\b\d+\b 

Demo

OR

(?:[+-])?\d+(?=[\s+-]|$) 

Demo

解釋(爲第1正則表達式):

  • 只要符合一個+-(如果你想添加更多的運營商)
  • ?製作+-可選
  • \b\d+\b匹配2非詞之間1個或多個數字(所以它不會包括係數)

解釋(用於所述第二正則表達式):

  • 只要符合一個+-(添加,如果你想要更多的運營商)
  • ?製作+-可選
  • \d+(?=[+-])匹配1個或多個數字(貪婪),緊跟着一個+-或一個空間或者如果它是行結束。如果需要,您可以添加更多的運算符。
+0

我試過了:re.findall(「(?:[+ - ])?\ b \ d + \ b」,「1 + 3x + 52-9-45x + x」)。但空了。我在這裏錯過了什麼? – derek

+0

我明白了。不要忘記在你的模式之前使用原始字符串標記「r」。 re.findall(R 「(?:[+ - ])\ B \ d + \ B'」, 「1 + 3×+ 52-9-45x + X」)。這完美地工作1 – derek