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

2024-04-25 04:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我见过类似的问题,但没有一个是针对这个问题的。我有一个使用+、-、*或/运算符的计算器表达式,我想对它进行标准化,以便有人输入的任何内容都与我的程序所需的方式相同。。。你知道吗

我的程序需要一个格式为“10-7*5/2+3”的字符串,每个值前后都有空格。我想把别人输入的任何东西,比如“10-7*5/2+3”或“10-7*5/2+3”,做成我指定的第一种格式。你知道吗

我的第一个想法是将字符串转换为一个列表,然后在字符串之间加上空格,并在字符串的前面和结尾连接空格,但明显的问题是“10”会被拆分为“1”和“0”,并在连接后显示为“10”。你知道吗

s = s.replace(" ", "")

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

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

我在想也许用RegEx做点什么会有帮助,但我不太确定如何把它付诸实施。我在心理上的一个主要失误是,当我这样做的时候,不要把10和其他更高阶的数字分割成它们的组成部分。你知道吗

我使用的是python3.5。你知道吗


Tags: 字符串程序内容列表if表达式格式结尾
3条回答

正如@fukanchik所建议的,这通常是以相反的方式完成的,比如将输入字符串分解为基本组件,然后根据需要重新组装。你知道吗

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

lexeme_regexes = [r"\+", "-", r"\*", "/", "\d+"]

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

regex = re.compile("|".join(lexeme_regexes))
lexemes = regex.findall("10 - 7 * 5 / 2 + 3")

要获得规范化的形式,只需再次进行组装:

normalized = " ".join(lexemes)

这个例子并不能确保所有的操作符都被无意义的空格分割,但是这需要更多的努力。你知道吗

我建议采取一种简单易行的方法:去掉所有空格,然后逐个字符地遍历字符串,在每个运算符符号之前和之后添加空格。你知道吗

任何一行中有两个运算符的操作都将是无效语法,因此您可以将其留给现有的计算器代码来抛出错误。你知道吗

 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

解决方案

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

使用正则表达式提取相关片段,忽略空格,然后使用连接将它们重新组合在一起。你知道吗

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+意味着匹配一行中的一个或多个数字。你知道吗

第二位:[...]字符集符号。意思是匹配集合中任何一个字符中的一个。现在+-*都是特殊的正则表达式字符,所以必须用反斜杠转义它们。正斜杠不是特别的,所以它不需要转义。所以[\+,\-,\*,/]意味着匹配一个,+,-,*,/中的任何一个。你知道吗

两个正则表达式之间的|是您的标准OR运算符。因此,匹配第一个表达式或第二个表达式。括号是regex中的组表示法,表示实际要返回的regex部分。你知道吗

相关问题 更多 >