2015-12-01 128 views
1

我想在Python中創建一個小的文本限制程序。基本上,用戶輸入文本,一些過濾器(一個字母,一個數字等)。用戶可以將過濾器(a和n爲字母數字等),但我偶然發現了這一點:蟒蛇:正則表達式匹配的字符串,只有字符串

if re.match("[a-zA-Z]", textToRestrict): 
    return True 
else: 
    return False 

這就是事情土崩瓦解。據推測,只有字母作爲過濾器,程序將只接受字符串,如dance。然而,if語句仍返回true如果textToRestric了,說,dance1234(不正確),而1234dance將返回false(正確的)。相反,如果我通過[0-9]測試數字,它仍然會返回true,即使它包含字母字符(假定字符不是第一個字符)也將返回true

如何使用正則表達式僅匹配某種類型,並以這種方式添加另一種類型(如類型字符串+類型數字)允許這兩種類型返回true

UPDATE:這是我用於多個過濾器的方法:

regex = "" 
if FilterClass.ALPHABETIC in arguments: 
    regex += "[a-zA-Z]" 
if FilterClass.CAPITAL_ALPHABETIC in arguments: 
    regex += "[A-Z]" 
if FilterClass.NUMERIC in arguments: 
    regex += "\d" 
if FilterClass.SPECIAL_CHARACTERS in arguments: 
    regex += "[^0-9a-zA-Z]*" 
if FilterClass.DASH_UNDERSCORES in arguments: 
    regex += "[-_]*"    

regall = "^(" + regex + ")+$" 

if re.match(regall, textToRestrict): 
    return True 
else: 
    return False 

arguments是由用戶輸入的參數。 if語句檢查那裏的內容,據推測,可以爲正則表達式字符串添加更多模式。

+1

爲什麼不使用'str.isalpha() '和'str.isdigit()'? – SirParselot

+0

您正則表達式不檢查位置上它是在字符串中,並沒有對匹配以外的任何一個字符'^ [A-ZA-Z]更多+從開始到結束$'比賽,上一個或者更多匹配的字母出現直到字符串的結尾。 –

+0

@SirParselot,因爲理想情況下,只要用戶使用合適的過濾器,用戶可以輸入字母,數字,特殊字符或這些字符的任意組合。我不確定'isalpha()'和'isdigit()'可以用於那個。 –

回答

4

在正則表達式的兩端添加anchors,加上一個量詞(+如果要排除空字符串; *如果你想允許空字符串)。現在,您只是檢查第一個字符(單數)是否是字母(即匹配[a-zA-Z])。

你想要的是:

re.match("^[a-zA-Z]+$", textToRestrict) 

(或者,如果你的過濾器是真的這個簡單,可以考慮使用像str.isalpha串方法,而不是,as SirParselot suggests in a comment

+0

如果您使用'match()'進行測試,則不需要左側錨點。 – Felk

+3

@Felk嚴格地說,你是對的 - 事實並非如此。無論如何,爲了明確起見,我寧願將它放在那裏。 – senshin

+0

這對一個工作,謝謝。如果將其視爲字符串,我可以添加到該模式,還是需要在最後加上'+ $'?我已經更新了上面的帖子,以展示我目前如何做事。 –

相關問題