使用WTForms和Python进行正则表达式验证

19

这是我的代码:

class CreateUser(Form):
    username = StringField('Username', [
        validators.Regexp('\w+', message="Username must contain only letters numbers or underscore"),
        validators.Length(min=5, max=25, message="Username must be betwen 5 & 25 characters")

    ])

    password = PasswordField('New Password', [
        validators.DataRequired(), 
        validators.EqualTo('confirm', message='Passwords must match')
    ])

    confirm  = PasswordField('Repeat Password')

问题出现在第3行。我希望用户名只包含字母和数字字符。由于某种原因,这个正则表达式只检查第一个字符。这里+符号不起作用的原因是什么?谢谢。


1
除非我错了,'\w+' 的意思是“一个或多个字符\w”,我认为你想要r'\w+'来防止转义。 - user2085282
@user2085282 嗯,那也不起作用。但我认为这可能与转义有关... - mpn
3个回答

25

用新的正则表达式替换原来的正则表达式

'^\w+$'

解决了这个问题。


2

我知道这个问题很久以前就已经有答案了,但是我发现在WTForms中提供字母数字验证的另一个选项是AlphaNumeric()。

from wtforms_validators import AlphaNumeric
...

class SignupForm(Form):
    login_id = StringField('login Id', [DataRequired(), AlphaNumeric()])

更多细节请参阅 https://pypi.org/project/wtforms-validators/


0

@mpn的解决方案很好,但我想知道为什么\w+不能匹配整个字符串。

在wtforms的Regexp类中,在方法__call__中,你会看到self.regex.match(field.data or '')将被调用。关于re.match文档中有这样的说明:

如果字符串的开头有零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。

因此,我们需要使用^来匹配字符串的开头,使用$来匹配字符串的结尾。在文档中了解更多关于特殊字符的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接