2011-03-29 59 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

相關問題