Как изменить выражение regrex для работы с пробелами - PullRequest
0 голосов
/ 26 марта 2020
import re
def addMultiplication(input1): 
    return re.sub(r'([^-+*/])\(', r'\1*(', input1)

У меня есть функция, которая будет принимать строку и добавлять символы умножения всякий раз, когда есть скобки, символизирующие умножение.

Некоторые примеры здесь (которые работают):

  • "4 (3)" -> "4 * (3)"
  • "(4) (3) ) "->" (4) * (3) "
  • " 4 * 2 + 9 -4 (-3) "->" 4 * 2 + 9 -4 * (- 3) "
  • "(- 9) (- 2) (4)" -> "(-9) * (2) * (4)"
  • "4 ^ (3)" -> "4 ^ (3) "
  • " (4-3) (4 + 2) "->" (4-3) * (4 + 2) "
  • " (Aflkdsjalkb) (г ) "->" (Aflkdsjalkb) * (g) "
  • " g (d) (f) "->" g * (d) * (f) "
  • " (4 ) (3) "->" (4) * (3) "

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

  • "(4) * (3)" -> "(4) * * (3)" | "(4) * (3)"
  • "(4-3 * (2)" -> "4-3 * * (2)" | 4-3 * (2 ) "

Примечание. Мне пришлось добавить несколько лишних пробелов в двух вышеприведенных примерах, потому что в противном случае они продолжали выделяться курсивом и форматироваться. Так что, в основном, если я избавлюсь от пробелов в моих двух приведенных выше примерах , это работает, но когда я оставляю пробел после звездочки, он работает неправильно.

Как бы я включил лишние пробелы в мое выражение regrex? Я пытался использовать \s, но я не уверен, как это работает .

1 Ответ

0 голосов
/ 26 марта 2020

Один из способов посмотреть на это состоит в том, что вы хотите поместить * между любым символом, di git или закрывающей скобкой ()), за которой следует открывающая скобка ((), или любой закрывающая скобка, за которой следует символ, di git или открывающая скобка; с некоторым количеством пробелов в середине. Для этой цели вы можете использовать предпросмотр, захватив начальный символ / цифру / скобку в группе 1:

([a-z0-9)](?= *\()|\)(?= *[a-z0-9(]))

Затем вы можете заменить это на \1*. Обратите внимание, что вы должны использовать флаг re.IGNORECASE (без учета регистра, также re.I), чтобы он работал для таких выражений, как A (B).

Демонстрация для regex101

В python:

def addMultiplication(input1): 
    return re.sub(r'([a-z0-9)](?= *\()|\)(?= *[a-z0-9(]))', r'\1*', input1, 0, re.IGNORECASE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...