我正在使用一个脚本来确定我的字符串是否是一个有效的变量。 这是非常基本的,但我似乎无法弄清楚如何使用正则表达式。
基本上我想要:
A-Z
a-z
0-9
no whitespace anywhere
no special char except _
这可能吗? 这就是我试过的:
re.match("[a-zA-Z0-9_,/S]*$", char_s):
答案 0 :(得分:4)
这样的模式应该有效:
^[a-zA-Z_][a-zA-Z0-9_]*$
或更简单:
^(?!\d)\w+$
在这两种情况下,只要不以数字开头,它就会匹配一个由一个或多个字母,数字或下划线组成的字符串。
第二种模式中的(?!…)
是负前瞻断言。它确保第一个字符不是数字。有关详细信息,请参阅manual。
答案 1 :(得分:3)
除了提到的正则表达式之外,您还需要确保它不是reserved keywords之一:
and del from not while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try
这样的事情:
reserved = ["and", "del", "from", "not", "while", "as", "elif", "global", "or", "with", "assert", "else", "if", "pass", "yield", "break", "except", "import", "print", "class", "exec", "in", "raise", "continue", "finally", "is", "return", "def", "for", "lambda", "try"]
def is_valid(keyword):
return (keyword not in reserved and
re.match(r"^(?!\d)\w+$", keyword) # from p.s.w.g answer
或者像@nofinator建议你可以而且应该只使用keyword.iskeyword()
。
答案 2 :(得分:1)
re.match(r"^[^\W\d]\w*$", char_s):
单词\w
字符等同于[a-zA-Z0-9_]
。标识符不能以数字开头,因此第一个字符匹配[^\W\d]
,其余字符匹配\w*
。
答案 3 :(得分:1)
正确的方法:
Python 2
import re
import keyword
import tokenize
re.match(tokenize.Name+"$", char_s) and not keyword.iskeyword(char_s)
Python 3
import keyword
char_s.isidentifier() and not keyword.iskeyword(char_s)
请注意,Python 2的方法在Python 3上无声地失败。
当你看到这些问题时,首先要问的是“ Python是如何做到的?”因为几乎所有的时间它都向用户公开了一个方法。