2012-12-02 32 views
11

से व्हाइटस्पेस को हटाने का पसंदीदा तरीका मैं स्ट्रिंग से सभी रिक्त स्थान को हटाना चाहता हूं।स्ट्रिंग

परिणाम होगा "पिता एसडीएफ sdfsdf के रूप में":

"asfasdfsdfsdf"

कई तरीके मैं इस लक्ष्य को हासिल करने के लिए के बारे में सोच सकते हैं, और मैं सोच रहा हूं कि कौन सा सबसे अच्छा है।

1.

"".join(" as fa sdf sdfsdf ".split()) 

2.

" as fa sdf sdfsdf ".replace(" ", "") 

और मुझे लगता है वहाँ अधिक हैं।
कौन सा पसंदीदा है?

+0

विकल्प 2 मेरे लिए अच्छा लग रहा है। – xagyg

उत्तर

6

मेरा मानना ​​है कि सबसे अच्छा और सबसे प्रभावी तरीका दूसरे संस्करण, " as fa sdf sdfsdf ".replace(" ", "") है, सबूत के रूप में आप timeit मॉड्यूल का उपयोग कर सकते हैं:

  • python -m timeit '"".join(" as fa sdf sdfsdf ".split())'

    1000000 loops, best of 3: 0.554 usec per loop

  • python -m timeit '" as fa sdf sdfsdf ".replace(" ", "")'

    1000000 loops, best of 3: 0.405 usec per loop

+0

मुझे लगता है कि आपका मतलब है "पुनरावृत्ति"? – Thomas

0

रेगेक्स सरल है और यह काम करता है। split() थोड़ा और जटिल है। Regex split() से अधिक पसंद किया जाता है।

+0

मैं बिल्कुल सहमत हूं। लेकिन सवाल regex के बारे में नहीं था। –

+0

ओह। जब मैंने इसका जवाब दिया तो जावा के बारे में सोच रहा था। – hologram

4

replace(" ", "") सबसे स्पष्ट और सबसे संक्षिप्त है।

+2

+1। यह विकल्प चुना जाना चाहिए क्योंकि यह * इरादे * का सबसे स्पष्ट रूप से वर्णन करता है। (आप "रिक्त स्थान को रिमोट" करना चाहते हैं, आप "विभाजित और विभिन्न विभाजकों के साथ स्ट्रिंग में शामिल नहीं होना चाहते हैं")। – Heinzi

2

replace का उपयोग करते हुए सभी खाली स्थान के वर्ण (उदा, नई-पंक्तियों, टैब) को नहीं निकालेंगे:

>>> 'abc\t\ndef'.replace(" ", "") 
'abc\t\ndef' 

मैं string.translate पसंद करते हैं:

>>> import string 
>>> 'abc\t\ndef'.translate(None, string.whitespace) 
'abcdef' 

संपादित करें: string.translate यूनिकोड स्ट्रिंग्स के लिए काम नहीं करता है; आप इसके बजाय re.sub('\s', '', 'abc\n\tdef') का उपयोग करना चाह सकते हैं।

+0

मुझे लगता है कि यह विधि अधिक मान्यता के योग्य है (जो कहना है कि मुझे स्ट्रिंग मॉड्यूल दस्तावेज पढ़ना चाहिए)। :) – Talvalin

+0

@ मार्टिनौ, नहीं, 'स्ट्रिंग.ट्रांसलेट' दुर्भाग्य से यूनिकोड तारों के साथ काम नहीं करता है (या पायथन 3 में हटाने के लिए बिल्कुल काम करता है)। –

+0

@ सैमुएल इसाकसन, गलत। पायथन 3: 'abc \ t \ ndef'.translate (str.maketrans (' ',' ', string.whitespace)) '। शब्दकोश कुंजी यूनिकोड क्रमिक मान (पूर्णांक) होना चाहिए, वर्ण नहीं। –

1

re.sub(" ","", s) मेरी पसंदीदा है।

+0

एक एकल चार प्रतिस्थापन के लिए फिर से? ouch ... –

4

एक ही बार में सभी सफेद स्थान को हटाने के लिए इस का उपयोग करें:

import re 

s = ' as fa sdf sdfsdf ' 
s = re.sub(r'\s+', '', s) 

s 
=> 'asfasdfsdfsdf' 

इस दृष्टिकोण का लाभ यह है कि यह सभी रिक्त स्थान के बीच वर्ण समाप्त है - एक, दो, कोई फर्क नहीं पड़ता कि कितने वहाँ है, क्योंकि कर रहे हैं नियमित अभिव्यक्ति r'\s+' मैचों "एक या अधिक" श्वेत रिक्ति वर्ण - रिक्त स्थान, टैब, आदि

+0

लेकिन एक नियमित प्रतिस्थापन एक समय में प्रत्येक पत्र को देखेगा और सभी रिक्त स्थान को हटाने का एक ही कार्य पूरा करेगा। कम कम्प्यूटेशनल जटिलता के कारण शायद अधिक कुशल। –

+1

आपके परिदृश्य पर निर्भर करता है, आप अन्य प्रकार की रिक्त स्थान जैसे \ r, \ n, \ t टैब, या कुछ अजीब रिक्त स्थानों पर विचार करना चाहेंगे जैसे यूनिकोड में। उस ने कहा, बहुत अधिक विचार किया जाना चाहिए - आप बुरी सूची के बजाय एक सफेद सूची चाहते हैं। – HelloSam

2

नियमित अभिव्यक्ति

>>> str = " as fa sdf sdfsdf " 
>>> import re 
>>> re.sub(r'\s', '', str) 
+1

+1 क्योंकि यह यूनिकोड का समर्थन करता है और सभी प्रकार के व्हाइटस्पेस को केवल स्पेस वर्णों को नहीं हटाता है (और इस तथ्य के बावजूद कि 'str' को एक चर नाम के रूप में उपयोग किया गया था जो उसी नाम के अंतर्निहित प्रकार को छुपाता है)। – martineau

1

सहित बस मिश्रण में एक और फेंकने के लिए:

from string import whitespace 
ws = set(whitespace) 
''.join(ch for ch in my_string if ch not in ws) 
+0

''' .join (ch_isspace() नहीं, my_string में ch के लिए ch) –