我看到了类似的问题,但没有一个问题涉及这一特定问题。我有一个使用+,-,*或/运算符的计算器表达式,我想将它标准化,这样任何人输入的任何东西都会与我的程序想要的一样.
我的程序需要一个格式为“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‘和其他更高的序号,而不是分裂成他们的选民。
我在蟒蛇3.5里。
发布于 2017-09-18 15:07:05
解决方案
一个想法,如果你只处理非常简单的计算器表达式(即数字和操作数)。如果您还有其他可能的元素,您只需调整正则表达式。
使用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+的意思是匹配一行中的一个或多个数字。
第二位:[...]是字符集表示法.它的意思是匹配一个的任何字符在集合中的。现在,+,-,*都是特殊的regex字符,所以必须用反斜杠来转义它们。正斜杠并不特殊,因此不需要转义。所以[\+,\-,\*,/]的意思是匹配+,-,*,/中的任意一个。
两个正则表达式之间的|是您的标准OR操作符。所以要么匹配第一个表达式,要么匹配第二个表达式。括号是regexes中的组表示法,表示您实际想要返回的正则表达式的哪个部分。
发布于 2017-09-18 15:07:18
我建议采取一种简单而简单的方法;删除所有空格,然后逐字符遍历字符串,在每个运算符符号之前和后面添加空格。
行中有两个运算符的任何内容都将是无效的语法,因此可以将其留给现有的计算器代码来抛出错误。
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发布于 2017-09-18 15:17:05
正如@fukanchik所建议的,这通常是反向完成的,就像将输入字符串分解为其基本组件,然后按照您的意愿重新组装它一样。
我想说,使用RegEx是正确的,因为它非常适合解析这种输入(因为您不需要编写更高级的解析器)。为此,只需将所有符号定义为小正则表达式:
lexeme_regexes = [r"\+", "-", r"\*", "/", "\d+"]然后组装一个可以用于“遍历”输入字符串的大型正则表达式:
regex = re.compile("|".join(lexeme_regexes))
lexemes = regex.findall("10 - 7 * 5 / 2 + 3")要获得规范化的表单,只需重新组装它:
normalized = " ".join(lexemes)但是,这个例子并不能确保所有的操作符都被空格所分割,这需要付出更多的努力。
https://stackoverflow.com/questions/46282403
复制相似问题