检查Python中两个字符是否相邻

时间:2014-10-01 12:19:49

标签: python regex string equation

在我的程序中,我需要检查用户输入的等式,以确保它是一个有效的等式。我使用myEquation[0].isdigitmyEquation[-1].isdigit()删除了开头或结尾处的任何运算符,但现在我需要确保没有运算符彼此相邻。

我想过以某种方式把' +',' - ',' /',' *'和& #39; X'进入一个名为operator的列表,然后检查该列表中的任何内容是否相邻,但我不知道列表是否像那样工作或如何做到这一点。

例如,如果用户输入"4++8-9",程序应返回False

5 个答案:

答案 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)

使用它:

([+-\/*x])\1+

演示:http://regex101.com/r/lL7bL8/2

如果操作符由一个操作符重复,

将替换操作符

答案 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*\/])才匹配行的开头。