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


143

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

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

क्या ऐसा करने के लिए इससे अच्छा तरीका है?

प्रत्येक विभाजन के बाद str2एक सूची में जोड़ा जाता है।


1
मैंने इस सवाल को खारिज कर दिया। कारण यह है कि जबकि सवाल ही प्रासंगिक है, दिए गए उदाहरण वास्तव में अनुरोधित समाधान की आवश्यकता के लिए पर्याप्त कठिन नहीं है। यदि आपके पास शब्दों के ब्लॉक, संख्याओं के ब्लॉक हैं और आप उन्हें अलग-अलग चर में अलग करना चाहते हैं तो एक regex की आवश्यकता होगी।
एरिकबवर्क

@erikbwork मैं परिणामी स्ट्रिंग में अवांछित स्पेस आइटम को हटाना चाहता था'str2'
user2763554

1
हाँ और आप इसे केवल उपयोग करके प्राप्त कर सकते हैं str1.split()। रेगेक्स की कोई आवश्यकता नहीं है।
एरिकबवर्क

जवाबों:


176

उपयोग करके (, )आप समूह को कैप्चर कर रहे हैं, यदि आप बस उन्हें हटा देते हैं तो आपको यह समस्या नहीं होगी।

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

हालाँकि, regex की कोई आवश्यकता नहीं है, str.splitबिना किसी परिसीमा के निर्दिष्ट आपके लिए व्हॉट्सएप द्वारा इसे विभाजित कर देगा। यह इस मामले में सबसे अच्छा तरीका होगा।

>>> str1.split()
['a', 'b', 'c', 'd']

यदि आप वास्तव में regex चाहते थे तो आप इसका उपयोग कर सकते हैं ( '\s'व्हॉट्सएप का प्रतिनिधित्व करता है और यह स्पष्ट है):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

या आप सभी गैर-व्हाट्सएप वर्ण पा सकते हैं

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']

4
इसे सरल रखें। str.splitनिश्चित रूप से सबसे अच्छा है: डी
जमीलाक

यदि मेरे पास एक स्ट्रिंग है जो प्रारंभ और समाप्ति के साथ समाप्त होती है तो मैं इसका उपयोग कैसे कर सकता हूं उदाहरण: 'abc de'। इसके लिए आउटपुट आता है['', 'a', 'b', 'c', 'de', '']
राखोलिया जेनिश

@ राखोलियाजैनिशstr1.split()
जमीलक

@jamylak string.split()एक विकल्प है। मैं पूछ रहा था कि क्या इसे रेगेक्स के साथ भी किया जा सकता है?
राखोलिया जेनिश

2
क्या आप re.findallविकल्प का उपयोग नहीं कर सकते हैं ?
जामिलाक

24

str.splitप्रक्रिया स्वतः ही आइटम के बीच सभी सफेद स्थान निकल जाएगा:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

डॉक्स यहां हैं: http://docs.python.org/library/stdtypes.html#str.split


1
@ GururajY.S .: str.split()शायद प्रकाश-कर्तव्य के रूप में कुछ के लिए सबसे अच्छा विकल्प है।
जोएल कॉर्नेट

7

जब आप उपयोग करते हैं re.splitऔर विभाजित पैटर्न में कैप्चरिंग समूह होते हैं, तो समूह आउटपुट में बनाए रहते हैं। यदि आप ऐसा नहीं चाहते हैं, तो इसके बजाय एक गैर-कैप्चरिंग समूह का उपयोग करें।


2
का उपयोग करना str.splitशायद आपके उदाहरण के लिए बेहतर है। मैं बस यह समझाना चाहता था कि आपको वह व्यवहार क्यों मिलता है जो आप करते हैं।
ब्रेनबार

2

यह वास्तव में बहुत सरल है। इसे इस्तेमाल करे:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1

2
मैं इसे +1 करूंगा लेकिन आप बदसूरत अर्ध-कॉलन का उपयोग कर रहे हैं।
जामिलाक

3
@ जमैलाक लोल। मैं उन्हें बदल दूंगा। :) जावा और अजगर का उपयोग करने की आदत!
शापित

1
@ GururajY.S। यदि आप केवल अंतरिक्ष के आधार पर विभाजित करना चाहते हैं, तो आपको बस इस्तेमाल करना चाहिएstringToSplit.split()
शापित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.