2014-03-14 46 views
2

我试图创建一个函数,该函数根据某些条件检查字符串的有效性。基于某些条件的字符串的有效性

条件:

  1. 0-9传递一个数字作为字符串(前 '1')将设置有效期为True。
  2. 将0-9 + *中的数字作为字符串传递(例如'9 *','2 *')将设置为True。
  3. 在括号中传递一个0-9 + * +数字0-9(例如'(9 * 1)','(1 * 3)')的字符串将被设置为True。
  4. 通过以上任何[除了2] + * +以上任何[括号内的2]将被设置为True。 ((9 * 1)* 1)

传入的任何内容都会导致设置为False。

下面是我做了什么:

CHARS = "*" 
NUMBERS = "" 

def validity(s): 
    valid = False 
    # Condition 1 
    if s in NUMBERS: 
     valid = True 
    # Condition 2 
    elif s in [c1 + CHARS for c1 in NUMBERS]: 
     valid = True 
    # Condition 3 
    elif s in ['(' + c1 + CHARS + c2 + ')' for c1 in NUMBERS for c2 in NUMBERS]: 
     valid = True 
    return valid 

我有1-3个条件才能正常工作。然而,我被卡住的条件是4.

我有一个粗略的想法,但我在使用代码实现我的想法时遇到了麻烦。

这是我的想法。如果条件4通过, ((9 * 1)* 1)对*符号左边的字符串运行有效性,并在*符号右边的字符串上运行有效性,如果两者均为真,则条件为真,因此有效设置为真正。如果任何人都可以帮助我用真正感激的代码写下我的想法。

这里有一些输入的输出:

validity('1') # Condition 1 
True 
validity('9') # Condition 1 
True 
validity('10') # Doesn't satisfy any of the conditions 
False 
validity('1*') # Condition 2 
True 
validity('4*') # Condition 2 
True 
validity('9*') # Condition 2 
True 
validity('10*') # Doesn't satisfy any of the conditions 
False 
validity('(3*4)') # Condition 3 
True 
validity('(3*9)') # Condition 3 
True 
validity('(4*9)') # Condition 3 
True 
validity('(10*9)') # Doesn't satisfy any of the conditions 
False 
validity('(3*2)*(3*1)') # Condition 4 
True 
validity('(3*2)*8') # Condition 4 
True 
validity('(3*2)*z') # Doesn't satisfy any of the conditions 
False 
+0

@Wooble谢谢你,我会改变那些现在。 – Sc4r

+0

正则表达式可能可以在单个re.search中执行此操作 – Trent

+0

算术操作是由上下文无关语法生成的,因此只有一个正则表达式只有在他不想继续解析这样的事情时才有效:'(3 *(3 * 2))*(3 * 1)','(3 *(3 *(3 * 2)))*(3 * 1)'等等 –

回答

1

这将解析所有你使用正则表达式写的投入,但请记住,算术运算由上下文无关文法产生的,所以你不会发现正则表达式(仅适用于常规语言)匹配所有现有操作(如(3*(3*2))*(3*1),(3*(3*(3*2)))*(3*1)等),则需要构建不同的操作。

import re 

parser1 = re.compile("[0-9]\\*?$") 
parser3 = re.compile("\\([0-9]\\*[0-9]\\)$") 
parser4 = re.compile("(\\([0-9]\\*[0-9]\\)|[0-9])\\*(\\([0-9]\\*[0-9]\\)|[0-9])$") 

def validity(s): 
    valid = False 

    # Condition 1 and 2 
    if parser1.match(s): 
     return True 
    # Condition 3 
    if parser3.match(s): 
     return True 
    # Condition 4 
    if parser4.match(s): 
     return True 

    return False 

print validity('1') # Condition 1 
print validity('9') # Condition 1 
print validity('10') # Doesn't satisfy any of the conditions 
print validity('1*') # Condition 2 
print validity('4*') # Condition 2 
print validity('9*') # Condition 2 
print validity('10*') # Doesn't satisfy any of the conditions 
print validity('(3*4)') # Condition 3 
print validity('(3*9)') # Condition 3 
print validity('(4*9)') # Condition 3 
print validity('(10*9)') # Doesn't satisfy any of the conditions 
print validity('(3*2)*(3*1)') # Condition 4 
print validity('(3*2)*8') # Condition 4 
print validity('(3*2)*z') # Doesn't satisfy any of the conditions 

的位置输出:

True 
True 
False 
True 
True 
True 
False 
True 
True 
True 
False 
True 
True 
False 
+0

我更新了我的答案,现在条件4只需要一个正则表达式 –

+0

你为什么不写'返回parser1.match(s)或parser3.match(s)或parser4.match(s)'? :P –

+1

'parserX.match(s)'不返回一个布尔值“True/False”值,如果解析正确则返回* Match Object *,否则返回None。所以如果他不再需要这些,那么传播一个不会被使用的东西是没有意义的。而且,在他的例子中,他打印来自'validity'函数的输出,并且如果我返回解析器结果,它将不会输出'True'或'False'。 –