Python регулярное выражение - условное соответствие? - PullRequest
0 голосов
/ 31 мая 2009

Я не знаю, подходит ли это слово, но я пытаюсь найти какое-то регулярное выражение, которое может извлечь коэффициенты и показатели из математического выражения. Выражение будет иметь вид 'axB + cxD + exF', где строчные буквы - это коэффициенты, а заглавные буквы - это показатели степени. У меня есть регулярное выражение, которое может соответствовать им обоим, но мне интересно, могу ли я использовать 2 регулярных выражения, одно для совпадения коэффициентов и одно для показателей степени. Есть ли способ сопоставить число с буквой на одной стороне без сопоставления буквы? Например, в «3х3 + 6х2 + 2х1 + 8х0» мне нужно получить ['3', '6', '2', '8'] а также ['3', '2', '1', '0']

Ответы [ 3 ]

5 голосов
/ 31 мая 2009

Вы можете использовать позитивный прогноз , чтобы сопоставить что-то, что сопровождается чем-то другим. Для сопоставления коэффициентов вы можете использовать:

>>> s = '3x3+6x2+2x1+8x0'
>>> re.findall(r'\d+(?=x)', s)
['3', '6', '2', '8']

Из документации модуля re:

(? = ...) Соответствует, если ... соответствует следующему, но не использует ни одной строки. Это называется косвенным утверждением. Например, Исаак (? = Азимов) будет совпадать с Исааком только в том случае, если "Азимов".

Для показателей, вы можете использовать положительный взгляд вместо:

>>> s = '3x3+6x2+2x1+8x0'
>>> re.findall(r'(?<=x)\d+', s)
['3', '2', '1', '0']

Опять из документов:

(? <= ...) Соответствует, если текущей позиции в строке предшествует совпадение для ... который заканчивается в текущей позиции. Это называется позитивным взглядом утверждение. (? <= abc) def найдет совпадать в abcdef, так как взгляд назад создаст резервную копию 3 символов и проверит, Содержащийся шаблон соответствует. </p>

1 голос
/ 31 мая 2009

Еще один способ сделать это без регулярного выражения:

>>> eq = '3x3+6x2+2x1+8x0'
>>> op = eq.split('+')
['3x3', '6x2', '2x1', '8x0']
>>> [o.split('x')[0] for o in op]
['3', '6', '2', '8']
>>> [o.split('x')[1] for o in op]
['3', '2', '1', '0']
1 голос
/ 31 мая 2009
>>> import re
>>> equation = '3x3+6x2+2x1+8x0'
>>> re.findall(r'x([0-9]+)', equation)
['3', '2', '1', '0']
>>> re.findall(r'([0-9]+)x', equation)
['3', '6', '2', '8']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...