2017-08-01 7 views
5

मैं एक स्ट्रिंग में शब्दों को ढूंढना चाहता हूं जो एक विशिष्ट पैटर्न से मेल खाते हैं। समस्या यह है कि, यदि शब्द किसी ईमेल पते का हिस्सा हैं, तो उन्हें अनदेखा किया जाना चाहिए।रेगेक्स - ईमेल पते के भीतर, पैटर्न में मिलान करें

"उचित शब्दों" के पैटर्न को सरल बनाने के लिए \w+\.\w+ - एक या अधिक वर्ण, वास्तविक अवधि, और वर्णों की एक और श्रृंखला।

वाक्य जो समस्या का कारण बनता है, उदाहरण के लिए, a.a b.b:c.c [email protected] है।

लक्ष्य केवल [a.a, b.b, c.c] से मेल खाना है। अधिकांश रेगेक्स I बिल्ड के साथ, e.e भी लौटाता है (क्योंकि मैं कुछ शब्द सीमा मिलान का उपयोग करता हूं)।

उदाहरण के लिए:

>>> re.findall(r"(?:^|\s|\W)(?<[email protected])(\w+\.\w+)([email protected])\b", "a.a b.b:c.c [email protected]") ['a.a', 'b.b', 'c.c', 'e.e']

मैं कैसे मिलान कर सकते हैं केवल शब्द है कि "@" होना नहीं जाते हैं?

+0

एक चालाक रेगेक्स जाने की कोशिश करने के बजाय, शायद पहले स्ट्रिंग को साफ करें? पहली पट्टी \ w + @ \ w + फिर प्रक्रिया। मैं अजगर के साथ बहुत सारे ईटीएल काम करता हूं और अक्सर कचरे को साफ करने के लिए यह आसान/तेज़ होता है, फिर डेटा को विभाजित/संसाधित करता है। – sniperd

+0

http: // www।rexegg.com/regex-best-trick.html#thetrick –

उत्तर

2

मैं निश्चित रूप से इसे पहले साफ़ कर दूंगा और रेगेक्स को सरल बनाउंगा।

पहले हम

words = re.split(r':|\s', "a.a b.b:c.c [email protected]") 

तो शब्द उन में है कि एक @ को फ़िल्टर कर सकते है।

words = [re.search(r'^(([email protected]).)*$', word) for word in words] 
1

ठीक एक regex के साथ ईमेल पते को पार्स है अत्यंत कठिन है, लेकिन अपने सरल बनाया मामले के लिए, शब्द का एक सरल परिभाषा ~ \w\.\w और ईमेल ~ any sequence that contains @ के साथ, आप आप क्या जरूरत है ऐसा करने के लिए इस regex खोज सकते हैं:

>>> re.findall(r"(?:^|[:\s]+)(\w+\.\w+)(?=[:\s]+|$)", "a.a b.b:c.c [email protected]") 
['a.a', 'b.b', 'c.c'] 

यहां की चाल अगले या पिछले शब्द में आने वाली चीज़ों पर ध्यान केंद्रित नहीं करना है, लेकिन वर्तमान में कैप्चर किए गए शब्द को किस तरह दिखाना है।

एक और चाल शब्द विभाजक को सही ढंग से परिभाषित करने में है। शब्द से पहले हम कई सफेद जगहों, : और स्ट्रिंग शुरू करने की अनुमति देंगे, उन वर्णों को उपभोग करते हैं, लेकिन उन्हें कैप्चर नहीं करते हैं। शब्द के बाद हमें लगभग वही की आवश्यकता होती है (स्ट्रिंग एंड को छोड़कर, स्टार्ट एंड को छोड़कर), लेकिन हम उन पात्रों का उपभोग नहीं करते हैं - हम एक लुकहेड दावे का उपयोग करते हैं।

1

आप \[email protected]\S+\.\S+ और मैच और कब्जा अन्य सभी संदर्भों में (\w+\.\w+) के लिए पैटर्न के साथ ईमेल की तरह सबस्ट्रिंग से मेल कर सकते हैं। re.findall का प्रयोग केवल कब्जा कर लिया मान और खाली आइटमों को फ़िल्टर (वे में re.findall परिणाम हो जाएगा जब वहाँ एक ईमेल मुकाबला नहीं है):

import re 
rx = r"\[email protected]\S+\.\S+|(\w+\.\w+)" 
s = "a.a b.b:c.c [email protected]" 
res = filter(None, re.findall(rx, s)) 
print(res) 
# => ['a.a', 'b.b', 'c.c'] 

Python demo देखें।

regex demo देखें।

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