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

Я использовал следующее регулярное выражение для поиска и сопоставления расширенных операторов присваивания:

AUG_ASSIGN = r'\+=|\-=|\*=|@=|/=|%=|/@=|&=|\|=|\^=|\<\<=|\>\>=|\*\*=|//='

У меня есть догадка, что можно устранить многократные вхождения '=', используя положительный прогноз или позитивный прогноз. Итак, мой первый поиск был разделом грамматики в справочном руководстве по Python. Даже там '=' встречается несколько раз:

augop:           "+=" | "-=" | "*=" | "/=" | "%=" | "**="
               | ">>=" | "<<=" | "&=" | "^=" | "|="

Понятно, что стандартный BNF не включает в себя позитивный прогноз или прогноз.

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

AUG_ASSIGN = <set of all binary operators>(?=\=)

1 ответ

Решение

Поместите отдельные символы в набор символов и чередуйте их с другими опциями, в которых есть два одинаковых символа, так что вы также можете поместить их в набор символов (внутри группы, чтобы один и тот же символ мог снова сопоставляться с обратной ссылкой), Поместите все вышеперечисленное в группу и завершите =:

(?:[+\-*@&/%^|^]|([*/><])\1)=

https://regex101.com/r/JA84zS/4

Нет необходимости искать обходной путь.

Другие вопросы по тегам