2014-03-14 72 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'。 –