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

2024-09-30 14:27:51 发布

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

我想用正则表达式('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'>

有人能解释一下为什么上面的表达式和上面的“-”和“[”匹配?在


Tags: nameinreobjectmatch数字outqq
3条回答

完整的字符串"[A-Za-z][A-Za-z\d_]*$", name)

name='qq-q'和name='kri[shna0'没有输出

编辑以匹配下划线

看这个link

你快到了!在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,因为您应该在这里检查边界。查看example 1以查看匹配的组是什么。在

您可以添加边界,如example 2。在

相关问题 更多 >