【问题标题】:using re.finditer to extract numbers from a polynomial使用 re.finditer 从多项式中提取数字
【发布时间】:2018-10-16 00:27:36
【问题描述】:

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

函数定义如下:

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+ 个数字。因此,2 不能在 2x 中匹配(与 48 的情况相同)。试试r"[+-]?(?&lt;![\d.])[0-9]+(?!\.?[0-9])"
  • 如果您允许使用分数,为什么不直接使用 [+-]?\d+[+-]?\d+(?:\.\d+)?
  • 为什么不减少到(-?\d+)(?:[^\d]|$)

标签: regex python-3.x polynomials


【解决方案1】:

您的正则表达式将匹配前导 +-(如果存在),并且数字后面的 word boundary 将阻止您匹配 cmets 中提到的 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'))

这会给你:

['2', '3', '4', '2', '8', '-16']

Demo Python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多