2016-01-28 51 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