रेगेक्स पर आधारित पायथन विभाजन स्ट्रिंग


115

"HELLO there HOW are YOU"ऊपरी मामले के शब्दों (अजगर में) की तरह एक स्ट्रिंग को विभाजित करने का सबसे अच्छा तरीका क्या है ?

तो मैं इस तरह के एक सरणी के साथ समाप्त होगा: results = ['HELLO there', 'HOW are', 'YOU']


संपादित करें:

मैंने कोशिश की है:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

यह काम करने के लिए प्रतीत नहीं होता है, यद्यपि।



5
जब आप कहते हैं कि कुछ काम नहीं करता है, तो आपको समझाना चाहिए कि क्यों। क्या आपको एक अपवाद मिलता है? (यदि ऐसा है, तो पूरे अपवाद को पोस्ट करें) क्या आपको गलत आउटपुट मिलता है?
गैरेथ लेटी

जवाबों:


134

मैं सुझाव देता हूँ

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

इस डेमो की जाँच करें


5
क्या होता है जब आप संकलन का उपयोग नहीं करते हैं?
फीलसबडमैन

3
प्रति फिर से डॉक्स , " सबसे नियमित अभिव्यक्ति संचालन मॉड्यूल स्तर के कार्यों और RegexObject तरीके के रूप में उपलब्ध हैं। कार्यों शॉर्टकट है कि आप पहले एक regex वस्तु को संकलित करने की आवश्यकता नहीं है, लेकिन कुछ ठीक करने मापदंडों याद आती है। " आप उपयोग कर सकते हैं re.split(re.split(pattern, string, maxsplit=0, flags=0))जैसा कि पहले उद्धृत डॉक्स में उल्लेख किया गया है।
ZaydH

57

आप एक लुकहेड का उपयोग कर सकते हैं:

re.split(r'[ ](?=[A-Z]+\b)', input)

यह प्रत्येक स्थान पर विभाजित हो जाएगा, इसके बाद ऊपरी-केस अक्षरों की एक स्ट्रिंग होती है जो शब्द-सीमा में समाप्त होती है।

ध्यान दें कि वर्ग कोष्ठक केवल पठनीयता के लिए हैं और इसे छोड़ा जा सकता है।

यदि यह पर्याप्त है कि किसी शब्द का पहला अक्षर ऊपरी मामला है (इसलिए यदि आप उसके सामने भी विभाजन करना चाहते हैं Hello) तो यह और भी आसान है:

re.split(r'[ ](?=[A-Z])', input)

अब यह हर स्थान पर विभाजित होता है और इसके बाद किसी भी ऊपरी अक्षर के अक्षर।


1
मैं कैसे बदलूंगा re.split(r'[ ](?=[A-Z]+\b)', input)ताकि ऊपरी मामलों के पत्र न मिले। उदा। यह "A" से मेल नहीं खाता? मैंने कोशिश की re.split(r'[ ](?=[A-Z]{2,}+\b)', input)। धन्यवाद!

@JamesEggers आपका मतलब है कि आपको कम से कम दो ऊपरी मामलों के पत्रों की आवश्यकता है, ताकि आप शब्दों में विभाजित न हों I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)करना चाहिए।
मार्टिन एंडर

2
मैं कम से कम [ ]+या शायद \W+थोड़ा और मामलों को पकड़ने का सुझाव दूंगा। फिर भी, एक अच्छा जवाब।
जॉर्ज

मैंने भी यही कोशिश की। हालांकि, [ ]मेरे लिए काम नहीं किया। इसके बजाय, मैंने इस्तेमाल किया \s। मेरे लिए काम करने वाला पूरा regexp थाre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk

0

आपके प्रश्न में स्ट्रिंग शाब्दिक है "\b[A-Z]{2,}\b", लेकिन \bइसका मतलब बैकस्पेस होगा, क्योंकि कोई आर-संशोधक नहीं है।

प्रयास करें: r"\b[A-Z]{2,}\b"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.