2017-09-02 111 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