2011-03-29 5 views
11
에 유효한 식별자인지 여부를 확인하기 위해

I 식별자에 대한 다음과 같은 정의를 가지고 :정규 표현식은 문자열 파이썬

기본적으로
Identifier --> letter{ letter| digit} 

나는 파일이 만들어 테스트에서 문자열을 가져옵니다 식별자 기능이 위에 정의 된 유효한 식별자인지 확인하십시오.

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

을하지만 난 그게 정수를 충족 할 때마다 내 프로그램을 실행할 때 그것은 유효한 식별자의 생각 :

나는 이것을 시도했습니다. 예

c = 0 ; 

가 괜찮 유효한 식별자 c 인쇄, 그러나 또한 유효한 식별자로서 0 지문

.

내가 뭘 잘못하고 있니?

+1

정의가 파이썬과 똑같지 않다는 것을 알고 있습니까? 파이썬은 밑줄도 허용합니다. –

답변

2

\ w는 숫자 및 문자와 일치합니다. 시도하십시오 ^[_a-zA-Z]\w*$

+2

조심해서, 파이썬 3은 식별자에있는 모든 유니 코드 문자와 숫자를 허용합니다. –

+0

초기 문자 다음에 0 개 이상을 일치 시키려면 "[_a-zA-Z] \ w *"여야합니까? –

+0

오른쪽 내용을 수정했습니다 – Joe

2

파이썬 3 들어, 유니 코드 문자와 숫자를 처리해야합니다. 그 우려가 있다면 그래서, 당신이 함께 얻을해야합니다

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

[^\d\W]는 번역 "숫자 없음"이 아닌 숫자가 아닌 및 문자에 "문자 나 밑줄 않은 문자"와 일치합니다. official reference에서

+1

과 거의 일치시킵니다.하지만 거의 ... 한 글자로 된 식별자 "a"는 실패합니다. "aa @ # $ %"를 유효한 식별자로 사용하십시오. – MestreLion

+0

@MestreLion : 감사합니다. 물론 맞습니다. 내 대답을 편집했습니다. –

19

: identifier ::= (letter|"_") (letter | digit | "_")*

그래서 정규 표현식은 다음과 같습니다

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

예 (파이썬 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' 등의 kewords와 일치한다는 것을 언급할만한 가치가있을 것입니다. 정규 표현식에 대한 변경을 제안하는 것이 아니라 OP가이를 염두에두기를 바랍니다. – JoeCondron

+1

@JoeCondron 파이썬에는 키워드 목록 frozenset을 감싸는 래퍼 인'keyword.iskeyword' 함수가 있기 때문에 이것은 또한 매우 쉽습니다. –