首页 > 解决方案 > Python 正则表达式:在字符和字母周围插入空格而不被空格包围

问题描述

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

我哪里错了?

标签: pythonregex

解决方案


而不是使用负面的lookbehinds和冗余重复相同的替换,您可以只捕获潜在的周围空白\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

推荐阅读