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

19 投票
3 回答
20337 浏览
提问于 2025-04-18 18:44

这是我的代码:

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 个回答

0

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

在 wtforms 的 Regexp 类 中,你会看到在 __call__ 方法里,会调用 self.regex.match(field.data or '')。根据 re.py 的文档,关于 re.match 的说明是:

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

所以,我们需要使用 ^ 来匹配字符串的开始部分,使用 $ 来匹配字符串的结束部分。想了解更多特殊字符的信息,可以查看 文档

2

我知道这个问题很早就有人回答过了,但我发现了另一个可以在WTForms中进行字母数字验证的方法,就是使用AlphaNumeric()

from wtforms_validators import AlphaNumeric
...

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

更多详细信息可以在这里找到 https://pypi.org/project/wtforms-validators/

25

用下面的正则表达式替换

'^\w+$'

解决了这个问题。

撰写回答