используя re.finditer для извлечения чисел из полинома - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь написать функцию, которая извлекает числа из полиномиального выражения .

Функция определяется следующим образом:

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'] * ​​1012 *. Почему выражение regex не находит другие числа в качестве соответствия выражению? Как правильно вернуть числа в строке, содержащей полиномиальное выражение?

1 Ответ

0 голосов
/ 06 мая 2018

Ваше регулярное выражение будет соответствовать ведущему + или -, если оно есть, и границе слова после цифры будет препятствовать сопоставлению x, как указано в комментариях.

Если вы хотите включить знак минус и не хотите включать знак плюс, вы можете сопоставить то, что вам не нужно, и захватить в группе то, что вы хотите, используя чередование .

(?:[+-]?\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'] * ​​1052 *

Демо Python

...