Регулярное выражение Python: вставка пробелов вокруг символов и букв, НЕ окруженных пробелами - PullRequest
1 голос
/ 01 июля 2019

У меня есть выражение 'Please calculate 1x20 +4 + 5-1 - 2/2 /4', которое мне нужно преобразовать в это:

'Please calculate 1 x 20 + 4 + 5 - 1 - 2 / 2 / 4' 

Важным требованием является то, чтобы между символами и интересными буквами оставалось только ОДИН пробел. Я написал следующий код, который не работал:

import re
message = 'Please calculate 1x20 +4 + 5-1 - 2/2 /4'
message = re.sub(r'\s*(?:(?<!\s)([<>x])(?!\s))\s*', " {0} ".format(re.search(r'\s*(?:(?<!\s)([<>x])(?!\s))\s*', message).group(0)), message)
message = re.sub(r'\s*(?:(?<!\s)([<>+])(?!\s))\s*', " {0} ".format(re.search(r'\s*(?:(?<!\s)([<>+])(?!\s))\s*', message).group(0)), message)
message = re.sub(r'\s*(?:(?<!\s)([<>-])(?!\s))\s*', " {0} ".format(re.search(r'\s*(?:(?<!\s)([<>-])(?!\s))\s*', message).group(0)), message)
message = re.sub(r'\s*(?:(?<!\s)([<>/])(?!\s))\s*', " {0} ".format(re.search(r'\s*(?:(?<!\s)([<>/])(?!\s))\s*', message).group(0)), message)
message = re.sub(r'\s*(?:(?<!\s)([<>*])(?!\s))\s*', " {0} ".format(re.search(r'\s*(?:(?<!\s)([<>*])(?!\s))\s*', message).group(0)), message)
print(message)

Куда я иду не так?

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Вместо того, чтобы использовать отрицательные взгляды и повторять одну и ту же замену, вы можете просто захватить потенциальные окружающие пробелы \s* (ноль или более) и сделать замену с гарантированным .

import re

message = 'Please calculate 1x20 +4 + 5-1 - 2/2 /4'
message = re.sub(r'\s*([<>x+*/-])\s*', ' \\1 ', message)
print(message)
  • \s* - ноль или более вхождений пробельных символов
  • [<>x+*/-] - класс символов регулярного выражения, соответствующий только одному из нескольких указанных символов

Выход:

Please calculate 1 x 20 + 4 + 5 - 1 - 2 / 2 / 4
1 голос
/ 01 июля 2019

Попробуйте захватить операторов и окружить их пробелами:

import re
if __name__ == '__main__':
    q = 'Please calculate 1x20 +4 + 5-1 - 2/2 /4'
    fixed = re.sub(r'\s*([+x/*\-])\s*', r' \1 ', q)
    print(fixed)

который печатает:

Please calculate 1 x 20 + 4 + 5 - 1 - 2 / 2 / 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...