Регулярное выражение извлекает весь текст перед строкой до пробела

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь проанализировать коэффициент «a» в квадратном уравнении (ax ^ 2 bx c). Однако длина коэффициента может варьироваться. Например, вот некоторые из предполагаемых результатов:

 input: 5x^2   3x   4
output: 5
  
 input: 12x^2   2x - 6
output: 12
  

Число также может быть в середине уравнения.

 input: 2x - 3x^2   4
output: 3
  

Как мне получить весь текст перед «x ^ 2», пока они не станут пробелом?

Я пытался использовать функцию split ():

 a = equation.split("x^2")
a = a[0]
  

но это не сработало бы в третьем примере

Комментарии:

1. Пожалуйста, расскажите нам, что вы пробовали

2. Почему бы не использовать split ?

3. @rootkonda Я отредактировал свой вопрос

Ответ №1:

Вот и все

 [- ]?d (.d )?(?=x^)
  

Протестируйте это здесь

Имейте в виду, что это регулярное выражение будет соответствовать только простым случаям, например, оно не будет соответствовать 2E3.

Комментарии:

1. По большей части это работает, но не включает или — в результат. Например: ввод: 2x — 3x ^ 2 вывод: 3

2. Вы можете добавить необязательный пробел между оператором и числом : [- ]?s?d (.d )?(?=x^)

Ответ №2:

Совет: используйте RegEx 101 для тестирования вашего шаблона:

 pattern = re.compile(r'([ -d.]*)x^2')
tests = [
    '5x^2   3x   4',
    '12x^2   2x - 6',
    '2x - 3x^2   4',
    'x^2 - 2x   1',
    '-x^2   6x - 9'
]

for t in tests:
    m = pattern.search(t)
    text = m.group(1)

    if text == '':
        coeff = 1
    elif text == '-':
        coeff = -1
    else:
        coeff = float(text)

    print(coeff)
  

С принтами:

 5.0
12.0
3.0
1
-1
  

Ответ №3:

Я увидел, что использование split тоже является вариантом из вопроса. Итак, вы хотите получить весь текст перед числами с помощью ^ оператора. Это будет работать только для этих трех примеров:

 x = '5x^2   3x   4'
y = '12x^2   2x - 6'
z = '2x - 3x^2   4'
print(x.split()[0])
print(y.split()[0])
print(z.split(' ')[0])
# split default argument is space
  

Вывод

 5x^2
12x^2
2x - 3x^2
  

И если вы хотите использовать только числа с помощью оператора ^ без предшествующего всего текста, измените z.split(' ')[0] на:

 print(z.split()[2])
# 3x^2