使用re.finditer从多项式中提取数字

时间:2018-05-05 19:17:39

标签: regex python-3.x polynomials

我正在尝试编写一个从多项式表达式中提取数字的函数。

该功能定义如下:

def getNumbers(polynomial):
    regex = re.compile(r"[+-]?(?<!\.)\b[0-9]+\b(?!\.[0-9])")
    numbers = []
    i = 0
    for match in regex.finditer(polynomial):
        numbers.append(match.group(i))
    i+=1
    return numbers

我用以下方法测试了该功能:

In [139]: getNumbers('2x^3+4x^2+8x-16')
Out[139]: ['3', '2', '-16']

在这种情况下,函数应输出 ['2','3','4','2','8',' - 16'] 为什么正则表达式找不到其他数字作为表达式的匹配? 在包含多项式表达式的字符串中返回数字的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的正则表达式会匹配前导+-(如果有),而数字后面的word boundary将阻止您匹配评论中提到的x

如果您确实想要包含减号并且不想包含加号,那么您可以使用alternation匹配您不想要的和在组中捕获的内容。

(?:[+-]?\d*\.\d*|\+?(-?\d+))

<强>详情

  • (?:非捕获组
    • [+-]?匹配可选的+-
    • \d*\.\d*匹配零个或多个数字,一个点和零个或多个数字
    • |
    • \+?(-?\d+)匹配一个+并捕获一个可选的-后跟一个或多个数字
  • )关闭非捕获组

例如:

import re

def getNumbers(polynomial):
    regex = re.compile(r"(?:[+-]?\d*\.\d*|\+?(-?\d+))")
    return  regex.findall(polynomial)

print(getNumbers('2x^3+4x^2+8x-16'))

那会给你:

  

[&#39; 2&#39;,&#39; 3&#39;,&#39; 4&#39;,&#39; 2&#39;,&#39; 8&#39;,& #39; -16&#39;]

Demo Python