Python 3:如何检查字符串是否是有效变量?

Python 3:如何检查字符串是否是有效变量?,python,python-3.x,Python,Python 3.x,我有一个字符串,想检查它是否可以用作有效变量,而不会出现语法错误。比如说 def variableName(string): #if string is valid variable name: #return True #else: #return False input >>> variableName("validVariable") output >>> True input >>>

我有一个字符串,想检查它是否可以用作有效变量,而不会出现语法错误。比如说

def variableName(string):
    #if string is valid variable name:
        #return True
    #else:
        #return False

input >>> variableName("validVariable")
output >>> True
input >>> variableName("992variable")
output >>> False

我不想使用.isidentifier()。我想做一个自己的函数

以下答案仅适用于“旧式”Python-2.7标识符

"validVariable".isidentifier()
#True
"992variable".isidentifier()
#False
<>自从我在回答问题后改变了你的问题,考虑写一个正则表达式:

re.match(r"[_a-z]\w*$", yourstring,flags=re.I)

以下答案仅适用于“旧式”Python-2.7标识符

"validVariable".isidentifier()
#True
"992variable".isidentifier()
#False
<>自从我在回答问题后改变了你的问题,考虑写一个正则表达式:

re.match(r"[_a-z]\w*$", yourstring,flags=re.I)

可以使用正则表达式

例如:

isValidIdentifier = re.match("[A-Za-z_](0-9A-Za-z_)*",identifier)
注意,他只检查字母数字字符。实际标准支持其他字符。请看这里:


您可能还需要排除保留字,如def、True、False等。。。请参见此处:

您可以使用正则表达式

例如:

isValidIdentifier = re.match("[A-Za-z_](0-9A-Za-z_)*",identifier)
注意,他只检查字母数字字符。实际标准支持其他字符。请看这里:


您可能还需要排除保留字,如def、True、False等。。。请参见此处:

在Python3中,有效标识符的字符可以超出ASCII范围,因为您不想使用,所以可以用Python编写自己的版本

其规格可在此处找到:

实施:
import关键字
进口稀土
导入Unicode数据
def是其他id的开始(字符):
"""
项目属于中的其他\u ID\u开始
http://unicode.org/Public/UNIDATA/PropList.txt
"""
返回布尔值(重新匹配(r'[\u1885-\u1886\u2118\u212E\u309B-\u309C]',字符))
def是否为其他id是否继续(字符):
"""
项目属于其他\u ID\u是否继续
http://unicode.org/Public/UNIDATA/PropList.txt
"""
返回布尔值(重新匹配(r'[\u00B7\u0387\u1369-\u1371\u19DA]',字符))
def为xid启动(字符):
#ID_Start被定义为具有以下其中一项的所有字符
#一般分类为大写字母(Lu)、小写字母
#字母(Ll)、标题字母(Lt)、修饰字母(Lm),
#其他字母(Lo)、字母数字(Nl)、下划线和
#带有其他\u ID\u Start属性的字符。XID_启动
#然后通过删除所有项,在规范化下关闭此集合
#NFKC规范化不是以下形式的字符
#ID\u开始ID\u继续*。
类别=Unicode数据。类别(字符)
返回(
{'Lu',Ll',Lt',Lm',Lo',Nl'}或
是否为其他id开始(字符)
)
def是\u xid\u continue(字符):
#ID_Continue定义为ID_Start中的所有字符,加上
#无间距标记(Mn)、间距组合标记(Mc)、十进制
#数字(Nd)、连接器标点符号(Pc)和字符
#携带另一个\u ID\u Continue属性。再一次,请继续
#在NFKC规范化下关闭此集合;它还添加了U+00B7
#支持加泰罗尼亚人。
类别=Unicode数据。类别(字符)
返回(
是开始(字符)还是结束
{'Mn','Mc','Nd','Pc'}中的类别或
其他id是否继续(字符)
)
def是有效的标识符(名称):
#所有标识符都转换为标准格式NFKC
#句法分析时;标识符的比较基于NFKC。
name=unicodedata.normalize(
“NFKC”,名称
)
#检查它是否是关键字
if关键字.iskeyword(名称):
返回错误
#标识符语法为*。
如果不是(是\u xid\u start(名称[0])还是名称[0]=''
返回错误
返回名称为[1:]的字符的全部(是否继续(字符))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#来自goo.gl/pvpYg6
断言有效\u标识符(“a”)为真
断言有效\u标识符(“Z”)为真
断言是有效的\u标识符(“\u”)是真的
断言有效\u标识符(“b0”)为真
断言是有效的\u标识符(“bc”)是真的
断言是有效的,标识符(“b”)是真的
断言有效\u标识符(“µ”)为真

assert是有效的标识符(“在Python3中,有效标识符的字符可以超出ASCII范围,因为您不想使用,所以可以用Python编写自己的版本

其规格可在此处找到:

实施:
import关键字
进口稀土
导入Unicode数据
def是其他id的开始(字符):
"""
项目属于中的其他\u ID\u开始
http://unicode.org/Public/UNIDATA/PropList.txt
"""
返回布尔值(重新匹配(r'[\u1885-\u1886\u2118\u212E\u309B-\u309C]',字符))
def是否为其他id是否继续(字符):
"""
项目属于其他\u ID\u是否继续
http://unicode.org/Public/UNIDATA/PropList.txt
"""
返回布尔值(重新匹配(r'[\u00B7\u0387\u1369-\u1371\u19DA]',字符))
def为xid启动(字符):
#ID_Start被定义为具有以下其中一项的所有字符
#一般分类为大写字母(Lu)、小写字母
#字母(Ll)、标题字母(Lt)、修饰字母(Lm),
#其他字母(Lo)、字母数字(Nl)、下划线和
#带有其他\u ID\u Start属性的字符。XID\u Start
#然后通过删除所有项,在规范化下关闭此集合
#NFKC规范化不是以下形式的字符
#ID\u开始ID\u继续*。
类别=Unicode数据。类别(字符)
返回(
{'Lu',Ll',Lt',Lm',Lo',Nl'}或
是否为其他id开始(字符)
)
def是\u xid\u continue(字符):
#ID_Continue定义为ID_Start中的所有字符,加上
#无间距标记(Mn)、间距组合标记(Mc)、十进制
#数字(Nd)、连接器标点符号(Pc)和字符
#携带另一个\u ID\u Continue属性。再次,XID\u Continue
#在NFKC标准化下关闭此集合;它还添加U+00B7
#支持加泰罗尼亚人。
类别=Unicode数据。类别(字符)
返回(
是开始(字符)还是结束
{'Mn','Mc','Nd','Pc'}中的类别或
其他id是否继续(字符)
)
def是有效的标识符(名称):
#所有标识符都转换为标准格式NFKC
#解析时;标识符的比较