如何只保留给定的运算符和数字?

时间:2018-06-27 18:50:39

标签: python regex python-3.x

在此问题中,我将对可接受的运算符进行硬编码,这些运算符将在代码中被允许:

acceptable_operators = ['x', '/' , '+', '-', '.']

现在我要说一个字符串:

sentence = "this 78isa6+trap//+sentence78-+6"

第一步,在删除了accepted_operators中所有非数字和字符串之后:

786+//+78-+6

我们可以看到,如果将...xxx减少到仅一个,并且加法和除法相同,那么多次出现相同的乘法就没有多大意义了,但是减号是不同的2分钟将导致+ 3分钟减去-等等。

如果不同的运算符彼此相邻: 如果是+-常规数学接手。 在其他情况下(例如+ /或+ x或-/或-x),乘法和除法运算符占优势,而+-被“删除” 但是,例如,如果我们有x-5,我们就不会删除负号,因为它表示5为负数。 如果我们有x/,在这种情况下,/

右边的一个被“删除”了

最终预期结果:

786/+78-6

2 个答案:

答案 0 :(得分:1)

您可以使用re.sub进行此操作。

第一次通话将删除不需要的字符。

第二个呼叫将使用捕获组以及之前的任何/x删除重复的.+-

第三个会规范符号+-的多次出现。

代码

import re

def normalize_sign(m):
    return '-' if m.group().count('-') % 2 else '+'

sentence = "this 78isa6+trap//+sentence78-+6"

# Remove characters that are not digits or operators
tmp = re.sub(r'[^\dx/+-.]', '', sentence)

# Replace multiple occurences of x, / or . by a single occurence
# and remove heading occurences of + and -
tmp = re.sub(r'[+\-]*([x/.])[x/.]*', r'\1', tmp)

# Normalize sign when multiple + and - are encountered
output = re.sub('[+\-]{2,}', normalize_sign, tmp)

print(output)

输出

786/+78-6

正则表达式说明

  • [^\dx/+-.]:否定集合[^...]与集合中不存在的任何内容匹配

  • [+\-]*([x/.])\1*\1匹配first capturing group匹配的内容,即(...)之间的模式。

  • [+\-]{2,}:匹配两个或多个符号。然后,方法re.sub可以接受一个可调用对象,它将匹配传递给该对象,并用返回的值替换。

答案 1 :(得分:0)

开始

  • 删除不需要的字符:[^0-9\+\/\-\*\.]

循环

  1. 删除不需要的重复项:\++(?=[0-9\/\-\*\.])|\*+(?=[0-9\/\-\+\.])
  2. 递归删除负运算符对:\-\-,直到不再\-\-

结束