在我的程序中,我需要检查用户输入的等式,以确保它是一个有效的等式。我使用myEquation[0].isdigit
和myEquation[-1].isdigit()
删除了开头或结尾处的任何运算符,但现在我需要确保没有运算符彼此相邻。
我想过以某种方式把' +',' - ',' /',' *'和& #39; X'进入一个名为operator
的列表,然后检查该列表中的任何内容是否相邻,但我不知道列表是否像那样工作或如何做到这一点。
例如,如果用户输入"4++8-9"
,程序应返回False
答案 0 :(得分:2)
列表作品
operator = ['+', '-', '/', '*']
def is_valid_input(myEquation):
for c1,c2 in zip(myEquation[:-1],myEquation[1:]):
if c1 in operator and c2 in operator:
return False
return True
答案 1 :(得分:0)
答案 2 :(得分:0)
给定一个包含等式的字符串s
,以下代码将对其进行迭代,并检查集合operators
中是否没有后续字符。
from itertools import tee
s = '2 + / 3'
operators = {'+', '-', '/', '*'}
# Create two iterators to iterate over the string but then advance one of them with next()
a, b = tee(s.replace(' ', ''))
next(b)
print(any(i in operators and j in operators for i, j in zip(a, b)))
# True
它使用itertools.tee
设置迭代器,迭代器可以依次迭代以检查相邻字符。如果任何迭代返回True
,则any
将返回True
(在这种情况下,如果两个相邻字符位于operators
中)。
我还用' '
做了一些简单的替换''
,以考虑那些喜欢在他们的方程式中添加空格的人,这是你必须要考虑的事情更重要的是。
答案 3 :(得分:0)
您可以生成所有连续的字符对,如下所示:
>>> eq = 'a+b*c'
>>> zip(eq[:-1], eq[1:])
[('a', '+'), ('+', 'b'), ('b', '*'), ('*', 'c')]
那么你只需检查那些对中没有任何一对 两个符号都是运算符:
>>> def valid(eq):
... ops = '+-*/'
... return not any(x in ops and y in ops for x, y in zip(eq[:-1], eq[1:]))
...
>>> valid('a+/b')
False
>>> valid('a+b*c')
True
答案 4 :(得分:0)
你可以通过正则表达式实现这一点。
>>> import re
>>> r = re.compile(r'^(?!.*?[-+*\/x][-+x*\/])')
>>> if r.match('a+/b'): print 'Valid'
...
>>> if r.match('a+b*cxd'): print 'Valid'
...
Valid
<强>解释强>
仅当运算符不连续存在时, ^(?!.*?[-+*\/x][-+x*\/])
才匹配行的开头。