我想使用正则表达式('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'>
有人能解释一下为什么上面的表达式匹配上面的 '-' 和 '[' 吗?
请您参考如下方法:
你快到了!在正则表达式中,* 匹配零个或多个给定字符,始终匹配最长的序列。例如,A* 将与 AAAbcde 匹配,匹配将为 AAA。它还会与 BCDE 进行空匹配,但仍然是匹配。要实现您想要的效果,您需要在模式末尾添加 $:
re.match("[a-zA-Z_][0-9a-zA-Z_]*$",name)
这要求模式匹配输入直到行尾,由 $
如果您使用的是 re.search,则需要以 ^ 开始该模式。但是 re.match 没有必要,因为它只匹配字符串的开头:Python3 doc: search vs match
