我有一个表达式'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)
我要去哪里错了?
答案 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