Python 这个正则表达式是什么意思?
我正在一个教授python的网站(learnstreet.com)上做一个基于验证的项目。 该项目的一个要求是必须使用regex来验证用户输入的各种字段 项目的第一部分是用户名验证。网站为用户名定义的约束包括: 如果提供了用户名,则返回True 是有效的,否则为假。如果用户名至少为5,则该用户名有效 字符长且无空格或特殊字符(例如非字母数字) 人物 我的解决方案不正确。该网站为我提供了以下用于用户名验证的正则表达式:Python 这个正则表达式是什么意思?,python,regex,validation,Python,Regex,Validation,我正在一个教授python的网站(learnstreet.com)上做一个基于验证的项目。 该项目的一个要求是必须使用regex来验证用户输入的各种字段 项目的第一部分是用户名验证。网站为用户名定义的约束包括: 如果提供了用户名,则返回True 是有效的,否则为假。如果用户名至少为5,则该用户名有效 字符长且无空格或特殊字符(例如非字母数字) 人物 我的解决方案不正确。该网站为我提供了以下用于用户名验证的正则表达式: ^[a-zA-Z0-9\]+$ 此表达式中的+$表示什么 另外,如果用户名不能
^[a-zA-Z0-9\]+$
此表达式中的+$
表示什么
另外,如果用户名不能包含任何非数字字符,并且该表达式在集合中包含下划线,那么这不是不正确的吗 您的正则表达式执行以下操作
^
断言字符串开头的位置
[a-zA-Z0-9\
这将匹配任何字母、数字或符号\
由于一个+
量词跟在上面的字符类([…]
)后面,它意味着在一次和无限次之间匹配字符类,根据需要返回(贪婪)
$
然后在字符串末尾断言位置 您的正则表达式执行以下操作
^
断言字符串开头的位置
[a-zA-Z0-9\
这将匹配任何字母、数字或符号\
由于一个+
量词跟在上面的字符类([…]
)后面,它意味着在一次和无限次之间匹配字符类,根据需要返回(贪婪)
$
然后在字符串末尾断言位置 具体地说,把这一切分解一下,你得到了这个正则表达式字符串:
^[a-zA-Z0-9_]+$
第一个子句是^
,在本文中,它仅表示字符串的开头
第二个子句是[a-zA-Z0-9\]+
,它表示集合[a-zA-Z0-9\]
中的一系列一个或多个(+
)字符,表示任何小写(a-z
)、大写(a-z
)或数字(0-9
)字符以及下划线(/code>)
最后一个子句是$
,在本文中,它仅表示字符串的结尾
也就是说,你真的应该尽可能少地使用正则表达式。我个人建议通过设置交叉点来解决这个问题
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)
我之所以喜欢这种方法,是因为regex通常是一种非常脆弱且通常很慢的方法。我原以为它会慢一些,但事实证明,这里的regex解决方案实际上比set方法快得多(大约2.5倍),但我仍然觉得set代码的灵活性和可维护性使它成为一个更好的整体解决方案
然而,看看Blender的解决方案,尽管它不是很灵活,但可以解决这两个问题。完全可读,实际上比正则表达式解决方案快三倍
为方便起见,Blender发布了解决方案:
def is_valid(username):
return len(username) >= 5 and username.replace('_', '').isalpha()
具体地说,将这一切分解为以下正则表达式字符串:
^[a-zA-Z0-9_]+$
第一个子句是^
,在本文中,它仅表示字符串的开头
第二个子句是[a-zA-Z0-9\]+
,它表示集合[a-zA-Z0-9\]
中的一系列一个或多个(+
)字符,表示任何小写(a-z
)、大写(a-z
)或数字(0-9
)字符以及下划线(/code>)
最后一个子句是$
,在本文中,它仅表示字符串的结尾
也就是说,你真的应该尽可能少地使用正则表达式。我个人建议通过设置交叉点来解决这个问题
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)
我之所以喜欢这种方法,是因为regex通常是一种非常脆弱且通常很慢的方法。我原以为它会慢一些,但事实证明,这里的regex解决方案实际上比set方法快得多(大约2.5倍),但我仍然觉得set代码的灵活性和可维护性使它成为一个更好的整体解决方案
然而,看看Blender的解决方案,尽管它不是很灵活,但可以解决这两个问题。完全可读,实际上比正则表达式解决方案快三倍
为方便起见,Blender发布了解决方案:
def is_valid(username):
return len(username) >= 5 and username.replace('_', '').isalpha()
^
是线锚的起点,仅在线的起点匹配
$
是一个线端锚点,仅在线端匹配
[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_33;]
,这可能是网站的意思