我正在一个教授python(learnstreet.com)的网站上进行基于验证的项目。 项目的要求是必须使用正则表达式来验证用户输入的各个字段。
项目的第一部分是用户名验证。网站为用户名定义的约束是:
Method 1 - Username Validation
如果提供了用户名,则返回True 有效,否则为False。如果用户名至少为5,则该用户名有效 字符长,没有空格也没有特殊字符(例如非字母数字) 字符。
我的解决方案不正确。该网站为我提供了以下用于用户名验证的正则表达式:
^[a-zA-Z0-9_]+$
。
此表达式中的+$
表示什么?
另外,如果用户名不能包含任何非数字字符,并且该表达式在集合中包含下划线,那么这是不正确的吗?
答案 0 :(得分:3)
^
是行锚点的开头,只会在行的开头匹配。
$
是行结束锚点,仅匹配行尾。
[a-zA-Z0-9_]
是一个接受字母,数字和下划线的字符类。
+
是一个量词,表示前一个字符或组的1倍或更多倍。
[a-zA-Z0-9_]+
将匹配至少1个字母,数字或下划线。
我个人会用:
^[a-zA-Z0-9]{5,}$
对于验证,因为它还考虑到用户名中至少有5个字符。
{n,m}
是一个变量量词,其最小重复次数为n
,最大重复次数为m
。如果省略n
,则相当于0到m
次。如果省略m
,则相当于n
最小重复次数达到无限次重复。
{5,}
因此意味着至少重复5次。
我不会使用下划线,因为我认为它是一个特殊的角色,但我猜这是可以被认为是主观的东西。
如上所述,\w
在正则表达式中称为单词字符,大致相当于[a-zA-Z0-9_]
,可能是网站的含义。
答案 1 :(得分:2)
特别打破这一切你有这个正则表达式字符串:
^[a-zA-Z0-9_]+$
第一个子句是^
,在此上下文中只表示字符串的开头。
第二个子句是[a-zA-Z0-9_]+
,表示集合+
中的一个或多个([a-zA-Z0-9_]
)个字符系列,表示任何小写字母(a-z
),大写(A-Z
)或数字(0-9
)字符以及下划线(_
)。
最后一个子句是$
,在这个上下文中只是表示字符串的结尾。
那就是说,你真的应该尽可能少地使用正则表达式。我个人建议用一个交集来解决这个问题。
import string
# First, define all the acceptable characters
acceptable = set(string.ascii_letters + string.digits + '_'))
def is_valid(username):
return len(username) >= 5 and set(username).issubset(acceptable)
我更喜欢这种方法的原因是因为正则表达式通常是一种非常脆弱且通常很慢的方法。我认为它会更慢,但事实证明这里的正则表达式解决方案实际上比设置方法快得多(大约2.5倍),但我仍然觉得设置代码的灵活性和可维护性使它更好整体解决方案。
然而,看看Blender的解决方案,虽然它不是那么灵活,但却解决了这两个问题。完全可读,实际上比正则表达式解决方案快三倍。
为方便起见,发布了Blender的解决方案:
def is_valid(username):
return len(username) >= 5 and username.replace('_', '').isalpha()
答案 2 :(得分:0)
^
在字符串
[a-zA-Z0-9_]
这将匹配任何字母,数字或符号_
。
由于+
量词跟在上面的字符类([...]
)之后,它意味着匹配字符类在ONE和UNLIMITED之间,根据需要返回(贪婪)
$
然后在字符串的末尾断言位置。