在此问题中,我将对可接受的运算符进行硬编码,这些运算符将在代码中被允许:
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
答案 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\+\/\-\*\.]
循环
\++(?=[0-9\/\-\*\.])|\*+(?=[0-9\/\-\+\.])
\-\-
,直到不再\-\-
结束