2016-01-28 48 views
2

嘗試檢查格式正確的名稱字符串,然後將其作爲正則表達式的練習返回。它捕獲的字符串,如Python正則表達式 - 不捕獲非字母數字

'bob1'55bob 'b64ob' 等

但不會趕上非字母數字輸入,如bob!。我一直認爲[a-z]+部分會照顧到這一點,查看文檔。我必須俯視一些東西,有什麼幫助?謝謝。

def get_name(self): 
    """Returns the user-name if valid""" 

    match_obj = re.match(r'\b[a-z]+\b', self.name, re.I) 
    if match_obj is None: 
     raise ValueError('Matching name not found') 
    return self.name 
+0

試試這個'\ b \ w + \ W +' –

+0

刪除了我的答案,如果你想讓用戶只輸入字母數字,那麼'^ [a-zA-90-9] + $',用re.I'^ [ a-z0-9] + $'或下劃線'^ \ w + $' – YOU

回答

2

邊界\b尋找\w字符序列的開頭或結尾。要了解您能看到什麼\w角色。

>>> import re 
>>> re.match('\w+', 'bob!') 
<_sre.SRE_Match object; span=(0, 3), match='bob'> 
>>> re.match('\w+', "there's") 
<_sre.SRE_Match object; span=(0, 5), match='there'> 

它匹配字母而不是標點符號。所以回到你的正則表達式\b[a-z]+\b。如果我要在大括號中圍繞bob!繪製邊界,它將看起來像{bob}!。所以正則表達式確實與結果bob匹配。

這是什麼使你的正則表達式的行爲方式的解釋。但是由於你沒有告訴我們你想要做什麼,所以不清楚如何回答你的問題。假設你想檢查字符串是否包含a-zA-Z沒有別的我會迴應推薦使用^[a-z]+$。這裏,^標誌着字符串的開始,$標誌着結束。

2

只允許由字母(我認爲這是你在問什麼,我可能是錯的)名...

def get_name(self): 
    """Returns the user-name if valid""" 

    match_obj = re.search(r'^[a-z]+$', self.name, re.I) 
    if match_obj is None: 
     raise ValueError('Matching name not found') 
    return self.name 

在這種情況下,錯誤將提高任何的bo1bbob!2bob

2
match_obj = re.match(r'\b[a-z]+$', self.name, re.I) 

match從串的開始start並比較一個nd可以匹配匹配,如果它可以匹配從0開始的0個或更多字符。要完成匹配,請使用$而不是\b