首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.5:用空格格式化字符串

Python3.5:用空格格式化字符串
EN

Stack Overflow用户
提问于 2017-09-18 14:55:39
回答 3查看 187关注 0票数 2

我看到了类似的问题,但没有一个问题涉及这一特定问题。我有一个使用+,-,*或/运算符的计算器表达式,我想将它标准化,这样任何人输入的任何东西都会与我的程序想要的一样.

我的程序需要一个格式为“10-7*5/2+3”的字符串,在每个值之前、之后和中间有空格。我想把任何人输入的任何东西,如"10-7*5/2+3“或”10-7*5/2+3 ",并使其成为我指定的第一个格式。

我的第一个想法是将字符串转换为一个列表,然后在中间加入空格,并将前端和末端的空格连接起来,但明显的问题是,'10‘被分割成'1’和'0‘,并在加入后以’10‘的形式出现。

代码语言:javascript
复制
s = s.replace(" ", "")

if s[0] == "-":
    s = "0" + s
else:
    s = s 

s = " " + " ".join(list(s)) + " "

我在想,也许用RegEx做点什么也许会有帮助,但我并不完全确定如何将其付诸行动。对我来说,最主要的错误是当我这样做的时候,得到'10‘和其他更高的序号,而不是分裂成他们的选民。

我在蟒蛇3.5里。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-18 15:07:05

解决方案

一个想法,如果你只处理非常简单的计算器表达式(即数字和操作数)。如果您还有其他可能的元素,您只需调整正则表达式。

使用regex提取相关片段,忽略空格,然后使用联接将它们重新组合在一起。

代码语言:javascript
复制
def compose(expr):
   elems = re.findall(r'(\d+|[\+,\-,\*,/])', expr) # a group consists of a digit sequence OR an operand
   return ' ' + ' '.join(elems) + ' ' # puts a single space between all groups and one before and after

compose('10- 7*5/2 + 3')
# ' 10 - 7 * 5 / 2 + 3 '

compose('10-7*5/2+3')
# ' 10 - 7 * 5 / 2 + 3 '

详细解释

re.findall调用的核心是正则表达式:r'(\d+|[\+,\-,\*,/])'

第一位:\d意味着匹配一位数字。+意味着匹配前面表达式的一个或多个。因此,\d+的意思是匹配一行中的一个或多个数字。

第二位:[...]是字符集表示法.它的意思是匹配一个的任何字符在集合中的。现在,+-*都是特殊的regex字符,所以必须用反斜杠来转义它们。正斜杠并不特殊,因此不需要转义。所以[\+,\-,\*,/]的意思是匹配+,-,*,/中的任意一个

两个正则表达式之间的|是您的标准OR操作符。所以要么匹配第一个表达式,要么匹配第二个表达式。括号是regexes中的组表示法,表示您实际想要返回的正则表达式的哪个部分。

票数 2
EN

Stack Overflow用户

发布于 2017-09-18 15:07:18

我建议采取一种简单而简单的方法;删除所有空格,然后逐字符遍历字符串,在每个运算符符号之前和后面添加空格。

行中有两个运算符的任何内容都将是无效的语法,因此可以将其留给现有的计算器代码来抛出错误。

代码语言:javascript
复制
 sanitised_string = ""
 for char in unformatted_string_without_spaces:
      if char in some_list_of_operators_you_made:
          sanitised_string += " " + char + " "
      else:
          sanitised_string += char
票数 1
EN

Stack Overflow用户

发布于 2017-09-18 15:17:05

正如@fukanchik所建议的,这通常是反向完成的,就像将输入字符串分解为其基本组件,然后按照您的意愿重新组装它一样。

我想说,使用RegEx是正确的,因为它非常适合解析这种输入(因为您不需要编写更高级的解析器)。为此,只需将所有符号定义为小正则表达式:

代码语言:javascript
复制
lexeme_regexes = [r"\+", "-", r"\*", "/", "\d+"]

然后组装一个可以用于“遍历”输入字符串的大型正则表达式:

代码语言:javascript
复制
regex = re.compile("|".join(lexeme_regexes))
lexemes = regex.findall("10 - 7 * 5 / 2 + 3")

要获得规范化的表单,只需重新组装它:

代码语言:javascript
复制
normalized = " ".join(lexemes)

但是,这个例子并不能确保所有的操作符都被空格所分割,这需要付出更多的努力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46282403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档