Python正则表达式:在字符和字母周围插入空格,但不要用空格包围

时间:2019-07-01 19:32:39

标签: python regex

我有一个表达式'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 个答案:

答案 0 :(得分:2)

您可以仅捕获潜在的周围空白\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*-零个或多个空白char
  • [<>x+*/-]-正则表达式字符类,仅匹配指定的几个字符中的一个

输出:

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

答案 1 :(得分:1)

尝试捕获运算符并将其周围留有空格:

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