Как объединить несколько регулярных выражений в одно?

Необходимо было добавить пробелов между математическими знаками /*+- в строке eq = 'a+b-c/d*30' и я не придумал, к сожалению ничего лучшего кроме как:

eq_new = re.sub(r'[-]', ' - ', eq)
eq_new = re.sub(r'[+]', ' + ', eq_new)
eq_new = re.sub(r'[/]', ' / ', eq_new)
eq_new = re.sub(r'[*]', ' * ', eq_new)

Но это явно противоречит DRY. Подскажите, пожалуйста, можно ли как-то сделать из 4х этих выражений одно? Спасибо!


Ответы (2 шт):

Автор решения: timur

А не проще с помощью str.replace?

s = 'a-a+a/a*a'

replaceable = ('+', '-', '/', '*')

for i in replaceable:
    s = s.replace(i, f' {i} ')
→ Ссылка
Автор решения: Wiktor Stribiżew

Используйте

re.sub(r'[-+/*]', r' \g<0> ', text)

См. пример работы регулярного выражения. [-+/*] находит -, +, / или *, а \g<0> подставляет текст целого совпадения.

Если пробелы уже существуют в некоторых местах, то можно использовать

re.sub(r'\s*([-+/*])\s*', r' \1 ', text)

Подробности

  • \s* - 0 и более пробельных символов
  • ([-+/*]) - Захватывающая подмаска №1 (\1 подставляет текст, захваченный этой подмаской, в шаблоне замены): -, +, / или *
  • \s* - 0 и более пробельных символов
→ Ссылка