2012-11-22 12 views
18

मैं काफी अजगर और regex (यहाँ regex नौसिखिया) करने के लिए नया हूँ एक स्ट्रिंग से अंत अंक मिलता है, और मैं निम्नलिखित सरल स्ट्रिंग है:अजगर regex:

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 

मैं केवल पिछले अंक निकालने के लिए चाहते हैं उपरोक्त स्ट्रिंग यानी 767980716 में और मैं सोच रहा था कि मैं इसे पाइथन रेगेक्स का उपयोग करके कैसे प्राप्त कर सकता हूं।

मैं की तर्ज पर समान कुछ करना चाहता था:

re.compile(r"""-(.*?)""").search(str(s)).group(1) 

यह दर्शाता है कि मैं बीच में सामान लगाना चाहते हैं (*।?) जो के साथ एक शुरू होता है "-" और के अंत में समाप्त हो जाती है स्ट्रिंग - लेकिन यह कुछ भी नहीं देता ..

मैं सोच रहा था कि कोई मुझे सही दिशा में इंगित कर सकता है .. धन्यवाद।

उत्तर

26

आप केवल पात्रों को खोजने के लिए re.match उपयोग कर सकते हैं:

>>> import re 
>>> s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 
>>> re.match('.*?([0-9]+)$', s).group(1) 
'767980716' 

वैकल्पिक रूप से, re.finditer काम करता है बस के रूप में अच्छी तरह से: सभी regexp घटकों के

>>> next(re.finditer(r'\d+$', s)).group(0) 
'767980716' 

स्पष्टीकरण:

  • .*? है a non-greedy match और जितना संभव हो उतना उपभोग करता है ible (एक लालची मैच अंतिम अंक को छोड़कर सबकुछ उपभोग करेगा)।
  • [0-9] और \d अंकों को कैप्चर करने के दो अलग-अलग तरीके हैं। ध्यान दें कि उत्तरार्द्ध भी matches digits in other writing schemes, जैसे ୪ या 2।
  • अभिभावक (()) अभिव्यक्ति की सामग्री को एक समूह बनाते हैं, जिसे group(1) (या दूसरे समूह के लिए 2, पूरे मैच के लिए 0) के साथ पुनर्प्राप्त किया जा सकता है।
  • + का अर्थ है एकाधिक प्रविष्टियां (अंत में कम से कम एक संख्या)।
  • $ केवल इनपुट के अंत से मेल खाता है।
3

उपयोग नीचे regex

\d+$ 

$ स्ट्रिंग के अंत को दर्शाया गया है ..

\d अंक के

+ कई बार

4

आपका Regex को पूर्ववर्ती चरित्र 1 से मेल खाता है (\d+)$ होना चाहिए।

  • \d+ अंकों (एक या अधिक)
  • $ स्ट्रिंग के अंत में मैच के लिए प्रयोग किया जाता है मिलान करने के लिए प्रयोग किया जाता है।

तो, अपने कोड होना चाहिए: -

>>> s = "99-my-name-is-John-Smith-6376827-%^-1-2-767980716" 
>>> import re 
>>> re.compile(r'(\d+)$').search(s).group(1) 
'767980716' 

और के रूप में पहले से ही s एक स्ट्रिंग है आप, str समारोह यहां उपयोग करने की आवश्यकता नहीं है।

+2

यदि आप अपना रेगेक्स पैटर्न 'आर' (\ d +) $ ''के रूप में लिखते हैं, तो आपको बैकस्लैश से बचने की आवश्यकता नहीं है। –

+0

@ सैममुसमैन .. हाँ आप सही हैं। संपादित :) –

2

इसके बजाय \d+$ का उपयोग करने का प्रयास करें। यह स्ट्रिंग के अंत के बाद एक या अधिक संख्यात्मक वर्णों से मेल खाता है।

7

अच्छा और सरल findall साथ:

import re 

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 

print re.findall('^.*-([0-9]+)$',s) 

>>> ['767980716'] 

Regex स्पष्टीकरण:

^   # Match the start of the string 
.*  # Followed by anthing 
-   # Upto the last hyphen 
([0-9]+) # Capture the digits after the hyphen 
$   # Upto the end of the string 

या अधिक बस सिर्फ अंक से मेल स्ट्रिंग के अंत में पीछा किया'([0-9]+)$'

1

कुछ के लिए नियमित अभिव्यक्तियों को सहेजें जो अधिक की आवश्यकता है भार उठाना।

>>> def parse_last_digits(line): return line.split('-')[-1] 
>>> s = parse_last_digits(r"99-my-name-is-John-Smith-6376827-%^-1-2-767980716") 
>>> s 
'767980716'