如何编写一个python正则表达式来确保字符不在模式的特定位置?

dkqlctbz  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(88)

我正在尝试编写一个验证用户名的正则表达式,其中一个要求是,如果字符串中有数字,则数字必须在字母之后,并且第一个数字不能为零。由于某种原因,我无法使它使包含一组以零开头的数字的字符串无效

username_pattern = r'^[a-z]{3}[a-z]*([1-9]*|[1-9]*[0-9]*)'
if not re.fullmatch(username_pattern, test_username):
    raise ValueError('username may have numbers but they must be after all the letters and may not being with 0')

我期望像“abc123”这样的东西能工作,但“abc0123”失败了,它们都能工作。

wrrgggsh

wrrgggsh1#

您可以使用r'^[a-z]{3,}([1-9]+[0-9]*)?'代替。

  1. [a-z]{3,}将至少匹配a-z 3次,这是您当前使用的[a-z]{3}[a-z]*的较短版本。
  2. ([1-9]+[0-9]*)将确保至少有一个来自1-9的字符在那里(+意味着至少有一个字符应当匹配),后面跟着任意数目的0-9字符。
    1.使用?将数字组设置为可选
    您可以尝试上面的正则表达式here
    这里有个简单的例子显示了不同的用户名-
import re
users = ['xyz123', 'xyz1234', 'xyz01', 'abdcd213', 'xy1234']
username_pattern = r'^[a-z]{3}[a-z]*([1-9]+[0-9]*)?'
for user in users:
    if not re.fullmatch(username_pattern, user):
        print(f'Invalid user: {user}')

输出:

Invalid user: xyz01
Invalid user: xy1234

相关问题