验证正则表达式:最小/最大字符、一个hypen和开始/完成条件

2024-04-19 14:03:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为用户名创建一个验证函数。它必须是:

  • 最少六个字符/最多16个字符
  • 只有字母、数字,最多一个连字符
  • 它必须以字母开头,不得以连字符结尾

我想出了一个正则表达式:

^([A-Za-z]+-?[A-Za-z0-9]{4,14}[A-Za-z0-9])$

除了最大字符数之外,它什么都做。我错过了什么

您可能想知道我为什么使用4到14:这是因为第一个和最后一个字符已经由其他条件定义,所以我需要剩余的字符至少为4(使其成为6个字符),最多为14个字符(使其成为16个字符)

这是Python中的一个简单验证函数:

# Username validation
import re

def validate(username):
    regex = re.compile('^([A-Za-z]+-?[A-Za-z0-9]{4,14}[A-Za-z0-9])$', re.I)
    match = regex.match(str(username))
    return bool(match)

print(validate("PeterParker")) #Valid username
print(validate("Peter-Parker")) #Valid username
print(validate("Peter-P-arker")) #Invalid username
print(validate("Peter")) #Invalid username
print(validate("PeterParker-")) #Invalid username
print(validate("-PeterParker")) #Invalid username
print(validate("1PeterParker")) #Invalid username
print(validate("Peter Parker")) #Invalid username
print(validate("PeterParkerSpiderMan")) #Invalid username

非常感谢你的建议


Tags: 函数rematch字母username字符validateregex
3条回答

我用循环来构建整个催眠和字母组合,相当野蛮。我想说使用长度签入代码要干净得多。如果需要表达式,可以在编译之前打印它

# Username validation
import re

def validate(username):
    print(username)
    hypen = []
    for length in range(4,14+1):
        for i in range(length):
            hypen.append("[A-Za-z]{{{}}}-[A-Za-z]{{{}}}".format(i,length-i-1))
    expression = '^([A-Za-z]([A-Za-z]{{4,14}}|{})[A-Za-z0-9])$'.format("|".join(hypen))
    regex = re.compile(expression, re.I)
    match = regex.match(str(username))
    return bool(match)

print(validate("PeterParker")) #Valid username
print(validate("Peter-Parker")) #Valid username
print(validate("Peter-P-arker")) #Invalid username
print(validate("Peter")) #Invalid username
print(validate("PeterParker-")) #Valid username
print(validate("-PeterParker")) #Invalid username
print(validate("1PeterParker")) #Invalid username
print(validate("Peter Parker")) #Invalid username
print(validate("PeterParkerSpiderMan")) #Invalid username

输出

PeterParker
True
Peter-Parker
True
Peter-P-arker
False
Peter
False
PeterParker-
False
-PeterParker
False
1PeterParker
False
Peter Parker
False
PeterParkerSpiderMan
False
^(?=.{6,16}$)[A-Za-z][A-Za-z0-9]*-?[A-Za-z0-9]+$

试试(?i)^(?=[a-z].{5,15}$)[a-z0-9]*-?[a-z0-9]+$

只需要在断言中验证长度

demo

相关问题 更多 >