Python 这个正则表达式是什么意思?

Python 这个正则表达式是什么意思?,python,regex,validation,Python,Regex,Validation,我正在一个教授python的网站(learnstreet.com)上做一个基于验证的项目。 该项目的一个要求是必须使用regex来验证用户输入的各种字段 项目的第一部分是用户名验证。网站为用户名定义的约束包括: 如果提供了用户名,则返回True 是有效的,否则为假。如果用户名至少为5,则该用户名有效 字符长且无空格或特殊字符(例如非字母数字) 人物 我的解决方案不正确。该网站为我提供了以下用于用户名验证的正则表达式: ^[a-zA-Z0-9\]+$ 此表达式中的+$表示什么 另外,如果用户名不能

我正在一个教授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-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;]
,这可能是网站的意思