2011-03-29 60 views
11
有效的标识符

我有一个标识符如下定义:正则表达式来确认一个字符串是否是在Python

Identifier --> letter{ letter| digit} 

基本上我有一个识别功能会从一个文件,并测试其做出字符串确保它是上面定义的有效标识符。

我已经试过这样:

if re.match('\w+(\w\d)?', i):  
    return True 
else: 
    return False 

但是当我每次遇到一个整数时间运行我的程序它认为这是一个有效的标识符。

例如

c = 0 ; 

它打印c作为有效的标识符这是很好的,但它也打印0作为有效IDENTIFER。

我在这里做错了什么?

+1

你知道你的定义和Python的定义不一样吧? Python也允许使用下划线。 – 2011-03-29 14:32:11

回答

2

\ w匹配数字和字符。尝试^[_a-zA-Z]\w*$

+2

小心,Python 3允许在其标识符中包含所有Unicode字母和数字。 – 2011-03-29 14:33:33

+0

因为您想在首字符后匹配0或更多,它应该是“[_a-zA-Z] \ w *”吗? – 2011-06-03 00:56:36

+0

已更新它,您的权利 – Joe 2011-06-03 13:00:11

2

对于Python 3,您需要处理Unicode字母和数字。所以,如果这是一个问题,你应该这样相处:

re_ident = re.compile(r"^[^\d\W]\w*$", re.UNICODE) 

[^\d\W]到“字符是字母或下划线”的字符不是一个数字,而不是“非字母数字字符”的翻译相匹配。

+1

几乎在那里...但不完全...它将失败单字母标识符“a”,并且还允许“aa @#$%”作为有效的标识符 – MestreLion 2012-04-13 02:47:19

+0

@MestreLion:谢谢,你当然是对的。我编辑了我的答案。 – 2012-04-13 05:49:24

19

official referenceidentifier ::= (letter|"_") (letter | digit | "_")*

所以正则表达式是:

^[^\d\W]\w*\Z 

实施例(对于Python 2只是省略re.UNICODE):

import re 
identifier = re.compile(r"^[^\d\W]\w*\Z", re.UNICODE) 

tests = [ "a", "a1", "_a1", "1a", "aa$%@%", "aa bb", "aa_bb", "aa\n" ] 
for test in tests: 
    result = re.match(identifier, test) 
    print "%s\t= %s" % (test, (result is not None)) 

结果:

a = True 
    a1 = True 
    _a1 = True 
    1a = False 
    aa$%@% = False 
    aa bb = False 
    aa_bb = True 
    aa 
    = False 
+3

我可能会值得一提的是,它匹配诸如“True”,“return”等关键字。我并不建议对正则表达式进行更改,只是OP可能想要考虑这一点。 – JoeCondron 2016-06-08 12:43:57

+1

@JoeCondron这也很容易做到,因为Python包含'keyword.iskeyword'函数,它只是关键字列表frozenset的一个包装。 – 2017-12-31 22:35:33

相关问题