使用 RE 查找仅由拉丁字母、数字和下划线组成的字符串,并且它们不能以数字开头



我想使用正则表达式('re')来查找是否仅由拉丁字母,数字和下划线组成,它们不能以数字开头。

我尝试使用

In [3]: name='qq-q'
In [4]: re.match("[a-zA-Z_][0-9a-zA-Z_]*",name)
Out[4]: <_sre.SRE_Match object; span=(0, 2), match='qq'>
In [5]: name='kri[shna0'
In [6]: re.match("[a-zA-Z_][0-9a-zA-Z_]*",name)
Out[6]: <_sre.SRE_Match object; span=(0, 3), match='kri'>

有人可以向我解释为什么上面的表达匹配' - '''和'['在上面?

您几乎在那里!在Regex中,*匹配给定字符的零或更多,始终匹配最长的序列。例如,A*将与AAAbcde匹配,比赛将为AAA。它也将与BCDE机智匹配,但仍然是一场比赛。为了实现所需的目标,您需要在模式结束时添加$

re.match("[a-zA-Z_][0-9a-zA-Z_]*$",name)

此请求模式与输入匹配,直到行结束为止,以$

表示

如果您使用的是re.search,则需要使用^启动模式。但是,re.match不需要,因为它仅从字符串的开头匹配:python3 doc:search vs match

您想匹配完整的字符串以成功。[a-zA-Z_][0-9a-zA-Z_]*匹配qq-q,因为您应该在此处检查边界。查看示例1,看看匹配组是什么。

您可以添加示例2中的边界。

到许多完整的字符串"[A-Za-z][A-Za-zd_]*$", name)

name ='qq-q'和name ='kri [shna0'

编辑以匹配下划线

请参阅此链接

不确定为什么您认为它匹配' - ''''''''?这是正确的行为。re.Match基本上寻找您在字符串开始时指定的正则拨号。在这种情况下,它将是Kri和QQ,因为下一个char不在您的正则时期中。

如果您对Regexen遇到麻烦,则可以随时使用普通的Python方法:

>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_letters + string.digits + '_'
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
>>> allowed = set(string.ascii_letters + string.digits + '_')
>>> allowed
{'X', 's', 'f', 'C', 'L', 'V', 'D', '0', 'H', 'N', '9', 'l', 'c', 'b', 'p', 'n', 'W', 'k', 'O', 'q', 'a', 'Q', 'J', 'r', '3', 'g', 'h', 'P', '8', 'T', '2', 'u', 'w', '5', 'R', 'Z', 'Y', 'm', 'e', '_', '1', 'j', 't', 'S', 'v', 'G', 'o', 'd', 'A', 'B', 'F', 'M', 'y', 'z', 'E', '7', 'x', 'I', '6', 'K', 'U', 'i', '4'}
>>> name = 'qq-q'
>>> not name[0].isdigit() and all(char in allowed for char in name)
False
>>> name = 'Aaf0fg5f0g0e'
>>> not name[0].isdigit() and all(char in allowed for char in name)
True

最新更新