2011-03-29 28 views
11
में एक वैध पहचानकर्ता है कि क्या पुष्टि करने के लिए

मैं एक पहचानकर्ता के लिए निम्नलिखित परिभाषा है:नियमित अभिव्यक्ति एक स्ट्रिंग अजगर

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

क्या यह "[_a-zA-Z] \ w *" होना चाहिए क्योंकि आप शुरुआती चरित्र के बाद 0 या उससे अधिक मिलान करना चाहते हैं? –

+0

इसे अपडेट किया गया, आपका दायां – Joe

2

पायथन 3 के लिए, आपको यूनिकोड अक्षरों और अंकों को संभालने की आवश्यकता है। तो यह है कि यदि एक चिंता का विषय है, तो आप इस के साथ मिलना चाहिए:

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

[^\d\W] एक चरित्र है कि एक अंक "अक्षरांकीय नहीं" नहीं है और नहीं करने के लिए "एक चरित्र है कि एक पत्र या अंडरस्कोर है" जिसका अनुवाद मेल खाता है।

+1

के रूप में "$% @ #%" से मेल खाता है ... लेकिन काफी नहीं ... यह एकल-अक्षर पहचानकर्ता "ए" के लिए असफल हो जाएगा, और यह भी अनुमति देता है एक वैध पहचानकर्ता के रूप में "aa @ # $%" – MestreLion

+0

@MestreLion: धन्यवाद, आप बिल्कुल सही हैं। मैंने अपना जवाब संपादित कर लिया है। –

19

official reference से: 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

मुझे यह उल्लेख करने लायक हो सकता है कि यह 'ट्रू', 'रिटर्न' आदि जैसे केवॉर्ड्स से मेल खाता है। मैं रेगेक्स में बदलाव का सुझाव नहीं दे रहा हूं, लेकिन सिर्फ ओपी इसे ध्यान में रखना चाहूंगा। – JoeCondron

+1

@ जोकंड्रॉन यह भी करना बहुत आसान है, क्योंकि पाइथन में 'keyword.iskeyword' फ़ंक्शन शामिल है, जो केवल कीवर्ड सूची फ्रोजनसेट के चारों ओर एक रैपर है। –

संबंधित मुद्दे