2010-03-30 10 views
15

अजगर 3 बुलाया str.isidentifierपायथन 2.6 में पायथन आइडेंटिफ़र() कार्यक्षमता कैसे प्राप्त कर सकते हैं?

मैं कैसे पायथन 2.6 में इसी तरह की सुविधा प्राप्त कर सकते हैं एक स्ट्रिंग विधि, मेरे अपने regex, आदि को फिर से लिखने की कमी है?

उत्तर

2
re.match(r'[a-z_]\w*$', s, re.I) 

अच्छी तरह से करना चाहिए। जहां तक ​​मुझे पता है कि कोई अंतर्निहित विधि नहीं है।

+0

ध्यान दें कि यह यूनिकोड प्रतीकों के साथ काम नहीं करता है, उदा। पहले अक्षर के लिए 'éllo'' – Almar

1

पायथन < 3.0 में यह काफी आसान है, क्योंकि आपके पास पहचानकर्ताओं में यूनिकोड वर्ण नहीं हो सकते हैं। यही कारण है कि काम करना चाहिए:

import re 
import keyword 

def isidentifier(s): 
    if s in keyword.kwlist: 
     return False 
    return re.match(r'^[a-z_][a-z0-9_]*$', s, re.I) is not None 
+0

'[a-z_]'। – bobince

+0

अच्छा, लेकिन पहचानकर्ता अंडरस्कोर से शुरू कर सकते हैं। –

+0

हाँ, मैं इसके बारे में सोच रहा था जब मैं इसे लिख रहा था। –

12

tokenize मॉड्यूल एक regexp नाम

अब तक
import re, tokenize, keyword 
re.match(tokenize.Name + '$', somestr) and not keyword.iskeyword(somestr) 
+3

इन उद्देश्यों के लिए, आपको '^' + tokenize.Name + '$' की आवश्यकता है। –

+0

पायथन आरक्षित शब्दों के लिए चेक में जोड़ें, और मुझे यह पसंद है। –

+2

@ डगलस एसजे। डी कूटो - आप एक स्ट्रिंग एक कीवर्ड है या नहीं, यह देखने के लिए 'आयात कीवर्ड', 'keyword.iskeyword (astring) 'का उपयोग कर सकते हैं, इसके दस्तावेज़ [यहां] देखें (http://docs.python.org/library/keyword.html # keyword.iskeyword)। – Abbafei

1

अच्छा जवाब बुलाया परिभाषित करता है। मैं इसे इस तरह लिखूंगा।

def is_valid_keyword_arg(k): 
    """ 
    Return True if the string k can be used as the name of a valid 
    Python keyword argument, otherwise return False. 
    """ 
    # Don't allow python reserved words as arg names 
    if k in keyword.kwlist: 
     return False 
    return re.match('^' + tokenize.Name + '$', k) is not None 
+0

पूंजी अक्षरों की अनुमति देने की आवश्यकता है। उत्तर के ऊपर एक ही समस्या है। –

+0

@ डगलस: यही वही है जो 'फ्लैश' है। लाइन की शुरुआत से – SilentGhost

0
मैं क्या उपयोग कर रहा हूँ

। मैं उन्हें मजबूत करने की कोशिश करूंगा। निम्नलिखित को पाइथन मॉड्यूल के रूप में सहेजा जा सकता है और सीधे कमांड लाइन से चलाया जा सकता है। यदि चलाया जाता है, तो यह फ़ंक्शन का परीक्षण करता है, इसलिए यह सही रूप से सही है (कम से कम उस हद तक जो दस्तावेज़ क्षमता को प्रदर्शित करता है)।

import keyword 
import re 
import tokenize 

def isidentifier(candidate): 
    """ 
    Is the candidate string an identifier in Python 2.x 
    Return true if candidate is an identifier. 
    Return false if candidate is a string, but not an identifier. 
    Raises TypeError when candidate is not a string. 

    >>> isidentifier('foo') 
    True 

    >>> isidentifier('print') 
    False 

    >>> isidentifier('Print') 
    True 

    >>> isidentifier(u'Unicode_type_ok') 
    True 

    # unicode symbols are not allowed, though. 
    >>> isidentifier(u'Unicode_content_\u00a9') 
    False 

    >>> isidentifier('not') 
    False 

    >>> isidentifier('re') 
    True 

    >>> isidentifier(object) 
    Traceback (most recent call last): 
    ... 
    TypeError: expected string or buffer 
    """ 
    # test if candidate is a keyword 
    is_not_keyword = candidate not in keyword.kwlist 
    # create a pattern based on tokenize.Name 
    pattern_text = '^{tokenize.Name}$'.format(**globals()) 
    # compile the pattern 
    pattern = re.compile(pattern_text) 
    # test whether the pattern matches 
    matches_pattern = bool(pattern.match(candidate)) 
    # return true only if the candidate is not a keyword and the pattern matches 
    return is_not_keyword and matches_pattern 

def test(): 
    import unittest 
    import doctest 
    suite = unittest.TestSuite() 
    suite.addTest(doctest.DocTestSuite()) 
    runner = unittest.TextTestRunner() 
    runner.run(suite) 

if __name__ == '__main__': 
    test() 
+0

're.match' मैच। – SilentGhost

1

मैं इस पर एक और दरार लेने का फैसला किया गया है, के बाद से वहाँ कई अच्छे सुझाव दिया गया है:

import keyword 
import re 

def isidentifier(candidate): 
    "Is the candidate string an identifier in Python 2.x" 
    is_not_keyword = candidate not in keyword.kwlist 
    pattern = re.compile(r'^[a-z_][a-z0-9_]*$', re.I) 
    matches_pattern = bool(pattern.match(candidate)) 
    return is_not_keyword and matches_pattern 
0

सभी समाधान अब तक प्रस्तावित यूनिकोड का समर्थन नहीं करते या अजगर 3 पर चलने अगर पहले चार में एक नंबर की अनुमति है।

संपादित करें: प्रस्तावित समाधान केवल पायथन 2 पर उपयोग किए जाने चाहिए, और पायथन 3 isidentifier पर उपयोग किया जाना चाहिए।

re.match(r'^\w+$', name, re.UNICODE) and not name[0].isdigit() 

मूल रूप से, यह परीक्षण है कि क्या कुछ (नंबर सहित) (कम से कम 1) वर्ण हैं, और फिर इसे जांच होती है कि पहले चार एक नंबर नहीं है: यहाँ एक समाधान है कि कहीं भी काम करना चाहिए है।

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