2013-05-06 70 views
2

我想寫一個函數,它將值與正則表達式進行比較以查看是否匹配。問題是我有很多類似的正則表達式,只有一個區別是{}^[a-z]{0,500}$ & ^[a-z]{0,200}$是類似的正則表達式,只是範圍/重複的差異。我正試圖解決如何處理這些正則表達式的一個函數的問題。到目前爲止,我已經寫了這個函數。但我認爲必須有一些比我下面做的更好的選擇。如果沒有指定最大值或最小值,它也應該能夠處理。爲正則表達式重複「{}」飛行

def check(value, min=None, max=None): 
    regex = "^[a-z]"+"{"+min+","+max+"}$" 
    r= re.compile(regex) 
    if r.match(value): 
     return True 
    else: 
     return False 
+0

那你爲什麼不直接用'^ [a-z] {0,500} $'? – HamZa 2013-05-06 08:48:43

+1

使用字符串構建RegExp總是感覺像使用字符串連接構建SQL聽起來很可怕,但是在您的特定情況下,這似乎是可以接受的(您不需要/需要首先使用str()將最小和最大值轉換爲字符串儘管?)另外,爲什麼'value'是一個可選參數? – 2013-05-06 08:48:46

+0

@BenjaminGruenbaum:那個價值的東西只是一個錯誤。我現在糾正了它。 min和max已經作爲字符串傳遞。但很好的一點是,他們應該在功能中鑄造在這裏。 – hjelpmig 2013-05-06 08:53:47

回答

4

使用min="0"max=""而不是(這樣一來,他們將建設的有效範圍,如果未指定)。

另外,不要做if condition: return True等 - 只返回匹配對象 - 如果有比賽就會計算爲True(如果你願意,你可以在以後做的東西與它)。

此外,如果您只使用一次,則無需編譯正則表達式。

def check(value, min="0", max=""): 
    regex = "[a-z]{" + min + "," + max + "}$" 
    return re.match(regex, value) 

而且,我已經去除了^,因爲它在re.match()隱。

+0

感謝你指出了^,所以沒有辦法使整潔,我想也許''重新''可能有一些選擇來處理這種情況。無論如何感謝您的幫助。 – hjelpmig 2013-05-06 09:10:50

+0

@BenjaminGruenbaum:謝謝你的提醒,我想我今天過得不好,忘記了很多事情。 – hjelpmig 2013-05-06 10:16:19