अजगर 3 बुलाया str.isidentifier
पायथन 2.6 में पायथन आइडेंटिफ़र() कार्यक्षमता कैसे प्राप्त कर सकते हैं?
मैं कैसे पायथन 2.6 में इसी तरह की सुविधा प्राप्त कर सकते हैं एक स्ट्रिंग विधि, मेरे अपने regex, आदि को फिर से लिखने की कमी है?
अजगर 3 बुलाया str.isidentifier
पायथन 2.6 में पायथन आइडेंटिफ़र() कार्यक्षमता कैसे प्राप्त कर सकते हैं?
मैं कैसे पायथन 2.6 में इसी तरह की सुविधा प्राप्त कर सकते हैं एक स्ट्रिंग विधि, मेरे अपने regex, आदि को फिर से लिखने की कमी है?
re.match(r'[a-z_]\w*$', s, re.I)
अच्छी तरह से करना चाहिए। जहां तक मुझे पता है कि कोई अंतर्निहित विधि नहीं है।
पायथन < 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
'[a-z_]'। – bobince
अच्छा, लेकिन पहचानकर्ता अंडरस्कोर से शुरू कर सकते हैं। –
हाँ, मैं इसके बारे में सोच रहा था जब मैं इसे लिख रहा था। –
tokenize मॉड्यूल एक regexp नाम
अब तकimport re, tokenize, keyword
re.match(tokenize.Name + '$', somestr) and not keyword.iskeyword(somestr)
इन उद्देश्यों के लिए, आपको '^' + tokenize.Name + '$' की आवश्यकता है। –
पायथन आरक्षित शब्दों के लिए चेक में जोड़ें, और मुझे यह पसंद है। –
@ डगलस एसजे। डी कूटो - आप एक स्ट्रिंग एक कीवर्ड है या नहीं, यह देखने के लिए 'आयात कीवर्ड', 'keyword.iskeyword (astring) 'का उपयोग कर सकते हैं, इसके दस्तावेज़ [यहां] देखें (http://docs.python.org/library/keyword.html # keyword.iskeyword)। – Abbafei
अच्छा जवाब बुलाया परिभाषित करता है। मैं इसे इस तरह लिखूंगा।
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
पूंजी अक्षरों की अनुमति देने की आवश्यकता है। उत्तर के ऊपर एक ही समस्या है। –
@ डगलस: यही वही है जो 'फ्लैश' है। लाइन की शुरुआत से – SilentGhost
। मैं उन्हें मजबूत करने की कोशिश करूंगा। निम्नलिखित को पाइथन मॉड्यूल के रूप में सहेजा जा सकता है और सीधे कमांड लाइन से चलाया जा सकता है। यदि चलाया जाता है, तो यह फ़ंक्शन का परीक्षण करता है, इसलिए यह सही रूप से सही है (कम से कम उस हद तक जो दस्तावेज़ क्षमता को प्रदर्शित करता है)।
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()
're.match' मैच। – SilentGhost
मैं इस पर एक और दरार लेने का फैसला किया गया है, के बाद से वहाँ कई अच्छे सुझाव दिया गया है:
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
सभी समाधान अब तक प्रस्तावित यूनिकोड का समर्थन नहीं करते या अजगर 3 पर चलने अगर पहले चार में एक नंबर की अनुमति है।
संपादित करें: प्रस्तावित समाधान केवल पायथन 2 पर उपयोग किए जाने चाहिए, और पायथन 3 isidentifier
पर उपयोग किया जाना चाहिए।
re.match(r'^\w+$', name, re.UNICODE) and not name[0].isdigit()
मूल रूप से, यह परीक्षण है कि क्या कुछ (नंबर सहित) (कम से कम 1) वर्ण हैं, और फिर इसे जांच होती है कि पहले चार एक नंबर नहीं है: यहाँ एक समाधान है कि कहीं भी काम करना चाहिए है।
ध्यान दें कि यह यूनिकोड प्रतीकों के साथ काम नहीं करता है, उदा। पहले अक्षर के लिए 'éllo'' – Almar