2011-06-28 13 views
6

में किसी भी संख्या को खोजने के लिए नियमित अभिव्यक्ति फिर से किसी भी संख्या के लिए नोटेशन क्या है? जैसे कि मैं किसी भी संख्या, सकारात्मक या नकारात्मक के लिए स्ट्रिंग खोज रहा हूं। मैं \ d + का उपयोग कर रहा हूं लेकिन यह 0 या -1स्ट्रिंग

+4

'r" -? \ D + "' कोशिश करें। संपादित करें: 'बाहर निकलने की आवश्यकता नहीं है' [] ' – Evpok

+3

रेगेक्स चीजों को उनके द्वारा नहीं पढ़ता है, लेकिन वे किस चरित्र वर्ग में हैं, इसलिए आपको नकारात्मक से मेल खाने के लिए एक वैकल्पिक वर्ण की आवश्यकता है। उस ने कहा, \ d + बिल्कुल * * मैच 0 होना चाहिए, यह \ d चरित्र वर्ग '[0-9]' में है। – Dylnuge

+0

'1.0e + 3' या' -123.456' के बारे में क्या - क्या आप उनसे भी मेल खाना चाहते हैं? –

उत्तर

17
सकारात्मक, नकारात्मक और/या दशमलव के लिए खोज

, आप [+-]?\d+(?:\.\d+)?

>>> nums = re.compile(r"[+-]?\d+(?:\.\d+)?") 
>>> nums.search("0.123").group(0) 
'0.123' 
>>> nums.search("+0.123").group(0) 
'+0.123' 
>>> nums.search("123").group(0) 
'123' 
>>> nums.search("-123").group(0) 
'-123' 
>>> nums.search("1").group(0) 
'1' 

इस्तेमाल कर सकते हैं इस प्रमुख, शून्य अनुगामी/पाठ्यक्रम के बारे में बहुत होशियार नहीं है:

>>> nums.search("0001.20000").group(0) 
'0001.20000' 

संपादित करें: एकल अंक संख्या खोजने के लिए उपरोक्त रेगेक्स को सही किया गया।

आप चरघातांकी रूप के लिए समर्थन जोड़ने के लिए चाहते हैं, तो [+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)? कोशिश:

>>> nums2 = re.compile(r"[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?") 
>>> nums2.search("-1.23E+45").group(0) 
'-1.23E+45' 
>>> nums2.search("0.1e-456").group(0) 
'0.1e-456' 
>>> nums2.search("1e99").group(0) 
'1e99' 
+2

मुझे सही करें लेकिन आपका regex एकल अंकों की संख्या से मेल नहीं खाएगा? –

+0

आह, अच्छा पकड़ो।मैं इसे पोस्ट-दशमलव भाग वैकल्पिक बनाने के लिए अपडेट करूंगा। –

+0

+1)) ठंडा फिक्स –

3

\d किसी भी nonnegative पूर्णांक से मेल खाने के लिए ठीक होना चाहिए। \d[0-9] (कोई एकल अंक वर्ण) के बराबर है, इसलिए निश्चित रूप से यह नकारात्मक संख्या से मेल नहीं खाएगा। उस मामले में एक वैकल्पिक ऋणात्मक चिह्न जोड़ें:

\-?\d+ 

\d निश्चित रूप से 0 से मेल खाएगी।

0

\ घ डिफ़ॉल्ट रूप से 0 से मिलान करेगा, इसलिए केवल जरूरत नकारात्मक मान से मेल करने के लिए अपने regex संशोधित करने के लिए है, तो आप ऐसा करने के लिए बस का उपयोग कर सकते हैं:

import re 
re.findall(r'[+-]?\d+', ' 1 sd 2 s 3 sfs 0 -1') 

या

import re 
re.findall(r'(?<!\S)[+-]?\d+(?!\S)', '234 +1 -10 23jjj ssf54 sdg5dfgdf') 
>>> ['234', '+1', '-10'] 
0

स्थिति मिलान करने के लिए ve या -3 या +5 में ऋणात्मक संख्या के रूप,, [+-]?\d+ का उपयोग करें:

re.findall('[+-]?\d+', 'sfkdjfsdfj-1skjfslkdjf+4') # ['-1', '+4'] 

सुनिश्चित करें कि आप ऋणात्मक चिह्न पिछले रख सकते हैं ताकि संकलक समझता है आप कुछ और मतलब न करना पड़े।

0

python re documentation के अनुसार, यदि यूनिकोड ध्वज सेट नहीं किया गया है तो \ d किसी भी अंक से मेल खाता है। अगर ध्वज सेट किया गया है, तो यह उस लोकेल में किसी भी अंक को मानता है।

यह कुछ अतिरिक्त हालांकि बिना ऋणात्मक संख्याओं से मेल नहीं खाएगी:

-?\d+ 

यह काम करता है, लेकिन किसी भी संख्या नहीं मिलता है, के बाद से संख्या काफी जटिल थोड़ा बातें हैं। इसे आजमाएं:

[-+]?\d*\.?\d+([eE][-+]?\d+)? 
संबंधित मुद्दे