регулярное выражение для захвата всех математических операторов в Python, таких как> =, <= и == - PullRequest
0 голосов
/ 21 января 2019
spec_op = ['+', '-', '*', '/', '%', '(', ')', '[', ']', '{', '}', '**', '>', '<', '=>', '<=', '==']

Я пишу регулярное выражение для захвата этих операторов из поля вычисления.но =>, <=, == эти операторы не будут захвачены.

Я пробовал:

import re
a = '(0 if ((aa+cc)<=vv) else ((aa+cc-vv)*(cv/(100+cv)))) if (aa<=vv) else ((aa - vv)*(cv/(100+cv)))'
re.findall(r"[\+|-|\*|\/|=|>|<|(>=)|(<=)|&|\||%|!|\^|\(|\)]",a)

это дает:

['(',
 '(',
 '(',
 '+',
 ')',
 '<',
 '=',
 ')',
 '(',
 '(',
 '+',
 ')',
 '*',
 '(',
 '/',
 '(',
 '+',
 ')',
 ')',
 ')',
 ')',
 '(',
 '<',
 '=',
 ')',
 '(',
 '(',
 ')',
 '*',
 '(',
 '/',
 '(',
 '+',
 ')',
 ')',
 ')']

Как можноя достигаю >= и <= в конечном результате с помощью регулярных выражений.

1 Ответ

0 голосов
/ 21 января 2019

Вы можете использовать

re.findall(r"[<>=]=|[-+*/=><&|%!^()]",a)

См. Демонстрационную версию Python :

import re
a = '(0 if ((aa+cc)<=vv) else ((aa+cc-vv)*(cv/(100+cv)))) if (aa<=vv) else ((aa - vv)*(cv/(100+cv)))'
print(re.findall(r"[<>=]=|[-+*/=><&|%!^()]",a))
# => ['(', '(', '(', '+', ')', '<=', ')', '(', '(', '+', '-', ')', '*', '(', '/', '(', '+', ')', ')', ')', ')', '(', '<=', ')', '(', '(', '-', ')', '*', '(', '/', '(', '+', ')', ')', ')']
print(list(set(re.findall(r"[<>=]=|[-+*/=><&|%!^()]",a)))) # Unique occurrences
# => ['+', '*', '(', ')', '-', '/', '<=']

Более длинные последовательности в списке альтернатив, где альтернативы не привязаны, должны предшествовать более короткимиз них.См. Помните, что движок Regex стремится .Кроме того, вы можете избежать переэкранирования, если вы используете альтернативы с одним символом внутри класса символов, где только несколько символов требуют экранирования, и если вы поместите - в начале или конце, он также может остаться без экранирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...