2011-12-21 16 views
13

मैं reg ex सीख रहा हूं और मैं केवल पूर्णांक को परिभाषित करने के लिए पायथन में एक नियमित अभिव्यक्ति का उपयोग करना चाहता हूं - पूरी संख्या दशमलव नहीं है। मैं एक है कि केवल d का उपयोग करके संख्या की अनुमति देता है कर सकता है, लेकिन यह भी दशमलव संख्या है जो मैं नहीं चाहता की अनुमति देता है:पूर्णांक के लिए पायथन रेगेक्स?

price = TextField(_('Price'),[validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),validators.Optional()] 

मैं कैसे केवल पूर्णांकों अनुमति देने के लिए कोड बदल सकते हैं?

धन्यवाद

+1

http://regexlib.com/ इन – wim

उत्तर

58

Regexp चरित्र के आधार पर काम करते हैं, और \d का मतलब है एक अंक 0 ... 9 और n एक दशमलव संख्या के लिए।

के लिए रेगुलर एक्सप्रेशन कि एक संकेत के साथ केवल पूर्णांकों से मेल खाता है उदाहरण

^[-+]?[0-9]+$ 

  1. ^ अर्थ हो सकते हैं - स्ट्रिंग
  2. की शुरुआत
  3. [-+]? - एक वैकल्पिक (यह क्या ? साधन है) शून्य या प्लस साइन
  4. [0-9]+ - एक या अधिक अंक (प्लस मी eans "एक या अधिक" और [0-9] एक और तरीका है कहने के लिए है \d)
  5. $ - स्ट्रिंग के अंत

नोट: संकेत संख्या का हिस्सा माना होने ठीक ही अगर आप सिर्फ पार्स करने के लिए की जरूरत है संख्या। अधिक सामान्य पार्सर्स अभिव्यक्तियों को संभालने के लिए संख्या के साइन आउट को छोड़ना बेहतर होता है: स्रोत स्ट्रीम जैसे 3-2 अन्यथा पूर्णांक, ऑपरेटर और एक अन्य पूर्णांक के बजाय दो पूर्णांक के अनुक्रम के रूप में पार्स किया जा सकता है। नकारात्मक संख्या तब मेरे अनुभव में होती है जो असीमित अस्वीकरण ऑपरेटर और उच्च स्तर के निरंतर फोल्डिंग से बेहतर होती है।

+0

एक मामूली बिंदु: '\ d' का मतलब कोई दशमलव अंक है, इसलिए यदि आप पाइथन 3 का उपयोग कर रहे हैं तो यह केवल' 0'..9 9 से अधिक मेल खाएगा। जैसे 're.match (" \ d "," \ u0665 ") 'मिलान करेगा (और' int (" \ u0665 ")' ''' देता है)। – Duncan

+0

यह पोस्ट हमेशा से पहले से है, लेकिन अगर कोई नया उस पर ठोकर खाता है, तो तकनीकी रूप से ऋण चिह्न एक ऑपरेटर (पायथन 3 में) होता है, पूर्णांक का हिस्सा नहीं: spec से: "ध्यान दें कि संख्यात्मक अक्षर में एक चिह्न शामिल नहीं है ; -1 जैसे वाक्यांश वास्तव में यूनरी ऑपरेटर '-' से शाब्दिक अभिव्यक्ति है और शाब्दिक 1 " –

+0

@en_Knight: यह आईएमओ पूरी तरह से अप्रासंगिक है। ओपी क्या पूछ रहा था वह मनुष्यों के लिए पूर्णांक संख्या ** स्वीकार करने की अभिव्यक्ति है **, पायथन 3 के लिए नहीं। जबकि "कीमत" होने पर शायद गैर-ऋणात्मक संख्याओं के लिए अर्हता प्राप्त हो सकती है, उदाहरण के लिए यह बहुत अधिक समझदारी कर सकता है "मूल्य अंतर" के लिए नकारात्मक पूर्णांक ... पायथन 3 का उपयोग करते हुए उस लेखांकन कार्यक्रम को लिखते समय भी। – 6502

8

आप प्रारंभ और स्ट्रिंग के अंत में regex anchor की जरूरत है:

^[0-9]+$ 

स्पष्टीकरण:

^  # Start of string 
[0-9]+ # one or more digits 0-9 
$  # End of string 
+1

जैसे प्रश्नों के लिए सोने है यह नकारात्मक पूर्णांक की अनुमति नहीं देता है ...सुनिश्चित नहीं है कि ओपी उन्हें – 6502

+0

@ 6502 से बचना चाहता है: ठीक है, क्योंकि यह मूल्य टेक्स्ट फ़ील्ड के लिए एक सत्यापन है, मैंने सोचा कि सकारात्मक पूर्णांक अधिक समझ में आता है, लेकिन फिर भी आपके अच्छी तरह से टिप्पणी किए गए उत्तर के लिए +1 :) –

+0

असल में सकारात्मक पूर्णांक डॉन ' मूल्य मूल्य फ़ील्ड के लिए बहुत अधिक समझ नहीं लेता है, जब तक कि कीमत सेंट में न हो .. – wim

7

आप स्पष्ट रूप से Django का उपयोग कर रहे हैं।

models.TextField() के बजाय आप शायद models.IntegerField() का उपयोग कर बेहतर हैं। न केवल यह आपके लिए जांच करेगा, लेकिन यह आपको कई लांगों में अनुवादित त्रुटि संदेश देगा, और यह आपके पाइथन कोड में टाइप प्रकार से डेटा में वैल्यू को टाइप करेगा।

0

मैं ^[-+]?([1-9]\d*|0)$ पसंद करता हूं क्योंकि ^[-+]?[0-9]+$0 से शुरू होने वाली स्ट्रिंग को अनुमति देता है।

RE_INT = re.compile(r'^[-+]?([1-9]\d*|0)$') 


class TestRE(unittest.TestCase): 
    def test_int(self): 
     self.assertFalse(RE_INT.match('+')) 
     self.assertFalse(RE_INT.match('-')) 

     self.assertTrue(RE_INT.match('1')) 
     self.assertTrue(RE_INT.match('+1')) 
     self.assertTrue(RE_INT.match('-1')) 
     self.assertTrue(RE_INT.match('0')) 
     self.assertTrue(RE_INT.match('+0')) 
     self.assertTrue(RE_INT.match('-0')) 

     self.assertTrue(RE_INT.match('11')) 
     self.assertFalse(RE_INT.match('00')) 
     self.assertFalse(RE_INT.match('01')) 
     self.assertTrue(RE_INT.match('+11')) 
     self.assertFalse(RE_INT.match('+00')) 
     self.assertFalse(RE_INT.match('+01')) 
     self.assertTrue(RE_INT.match('-11')) 
     self.assertFalse(RE_INT.match('-00')) 
     self.assertFalse(RE_INT.match('-01')) 

     self.assertTrue(RE_INT.match('1234567890')) 
     self.assertTrue(RE_INT.match('+1234567890')) 
     self.assertTrue(RE_INT.match('-1234567890')) 
संबंधित मुद्दे