स्ट्रिंग से सभी व्हाट्सएप कैसे पट्टी करें


179

मैं एक अजगर स्ट्रिंग में सभी रिक्त स्थान कैसे छीन सकता हूं? उदाहरण के लिए, मैं चाहता हूं कि एक स्ट्रिंग strip my spacesको चालू किया जाए stripmyspaces, लेकिन मैं इसे पूरा नहीं कर सकता strip():

>>> 'strip my spaces'.strip()
'strip my spaces'

13
ध्यान दें कि str.strip केवल व्हाट्सएप के प्रमुख और अनुगामी को प्रभावित करता है।

जवाबों:


311

बिना sep पैरामीटर के str.split के व्यवहार का लाभ उठाना:

>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'

यदि आप सभी व्हाट्सएप के बजाय रिक्त स्थान हटाना चाहते हैं:

>>> s.replace(" ", "")
'\tfoo\nbar'

समय से पहले अनुकूलन

भले ही दक्षता प्राथमिक लक्ष्य नहीं है - स्पष्ट कोड लिखना - यहाँ कुछ प्रारंभिक समय हैं:

$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop

ध्यान दें कि रेगेक्स कैश्ड है, इसलिए यह उतना धीमा नहीं है जितना आप कल्पना करेंगे। पहले से इसे संकलित करने से कुछ मदद मिलती है, लेकिन यदि आप इसे कई बार कहते हैं, तो यह केवल व्यवहार में ही होगा :

$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop

भले ही re.sub 11.3x धीमा है, याद रखें कि आपकी अड़चनें अन्यत्र आश्वस्त हैं। अधिकांश कार्यक्रम इन 3 विकल्पों में से किसी के बीच अंतर को नोटिस नहीं करेंगे।


यह शायद \s+प्रतिस्थापन की तुलना में धीमी है । मैं फिर से साथ रहना होगा।
ओटीजेड

@OTZ: आप आश्चर्यचकित हो सकते हैं, लेकिन "याद रखें" नोट देखें।

@ रॉगर हम्म। दिलचस्प। क्या आपने s.translateकिसी भी तरह से विधि की कोशिश की है ? यह शायद इस पृष्ठ पर दिखाए गए सभी तरीकों को धड़कता है।
ओटीजेड

@ रॉजर पटे: आपको अनुवाद के लिए 'टेबल' तर्क की आवश्यकता नहीं है, यह हो सकता है None- हालांकि, आश्चर्यजनक रूप से, जो इसे धीमा कर देता है ...
मार्टीन्यू

1
कोशिश करो myString.translate(None, " \t\r\n\v")। यह केवल रोजर की सबसे तेज़ (विभाजित और शामिल) तकनीक के रूप में 83% लेता है। सुनिश्चित नहीं है कि यह सभी सफेद अंतरिक्ष वर्णों को कवर करता है जो विभाजन करता है, लेकिन यह संभवतः अधिकांश ASCII अनुप्रयोगों के लिए पर्याप्त होगा।
ब्रायनमर्न्स

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

किसी भी व्हाट्सएप वर्ण को भी संभालता है, जिसके बारे में आप नहीं सोच रहे हैं (मेरा विश्वास करो, बहुत सारे हैं)।


3
यह एक हल के बहुत कम है तो स्वीकृत उत्तर है।
जॉन स्मिथ

यह अन्य उत्तरों की तुलना में अधिक स्पष्ट है, इसलिए यह मेरे लिए केक लेता है।
ट्रिस्टन

34

वैकल्पिक रूप से,

"strip my spaces".translate( None, string.whitespace )

और यहाँ Python3 संस्करण है:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

यह सबसे अधिक पायथोनिक लगता है। इसे शीर्ष पर क्यों नहीं रखा गया है?
आरबीपी

जवाब में पायथन 3 कोड काम करता है। @DanMenes से टिप्पणी अप्रचलित है
igo

3
NameError: name 'string' is not defined
जेल्फ़िर कलस्टहल

@ZelphirKaltstahl की जरूरत हैimport string
शाहरज सलझोई

13

प्रतिस्थापन का उपयोग करना सबसे सरल है:

"foo bar\t".replace(" ", "").replace("\t", "")

वैकल्पिक रूप से, एक नियमित अभिव्यक्ति का उपयोग करें:

import re
re.sub(r"\s", "", "foo bar\t")

10

पायथन में शुरुआती रिक्त स्थान निकालें

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

पायथन में ट्रेलिंग या अंत रिक्त स्थान निकालें

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

शुरुआत से व्हाइटस्पेस को हटाएं और पायथन में स्ट्रिंग के अंत

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

अजगर में सभी रिक्त स्थान निकालें

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

के साथ एक regex की कोशिश करो re.sub। आप सभी व्हाट्सएप के लिए खोज कर सकते हैं और एक खाली स्ट्रिंग के साथ बदल सकते हैं।

\sआपके पैटर्न में व्हाट्सएप पात्रों से मेल खाएगा - और न केवल एक स्थान (टैब, नईलाइन्स, आदि)। आप मैनुअल में इसके बारे में अधिक पढ़ सकते हैं ।


मुझे पता नहीं है कि
रेगेक्स

@wrongusername: री-मॉड्यूल मैनुअल पेज के लिंक के साथ अपडेट किया गया।
मैथ्यू इस्लिन

2
import re
re.sub(' ','','strip my spaces')

3
एसओ में आपका स्वागत है। यद्यपि हम आपके उत्तर के लिए धन्यवाद देते हैं, लेकिन बेहतर होगा यदि वह अन्य उत्तरों के शीर्ष पर अतिरिक्त मूल्य प्रदान करे। इस मामले में, आपका उत्तर अतिरिक्त मूल्य प्रदान नहीं करता है, क्योंकि कोई अन्य उपयोगकर्ता पहले से ही उस समाधान को पोस्ट करता है। यदि एक पिछला उत्तर आपके लिए उपयोगी था, तो आपको पर्याप्त प्रतिष्ठा होने के बाद उसे वोट देना चाहिए
मैक्सिमिलियन पीटर्स

यह इस सवाल का जवाब नहीं देता है "सभी सफेद स्थान कैसे हटाएं"। यह केवल रिक्त स्थान को निकालता है
निक

2

जैसा कि रोजर पाटे ने उल्लेख किया है निम्नलिखित कोड मेरे लिए काम करते हैं:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

मैं निम्नलिखित कोड चलाने के लिए Jupyter नोटबुक का उपयोग कर रहा हूं:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

एक सूची फिल्टर करने के लिए मानक तकनीक लागू होते हैं, हालांकि वे के रूप में कुशल के रूप में नहीं कर रहे हैं split/joinया translateतरीकों।

हमें व्हाट्सएप का एक सेट चाहिए:

>>> import string
>>> ws = set(string.whitespace)

filterनिर्मित:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

एक सूची समझ (हाँ, कोष्ठक का उपयोग करें: नीचे बेंचमार्क देखें):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

एक गुना:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

बेंचमार्क:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

टीएल / डॉ

पायथन 3.6 का उपयोग करके इस समाधान का परीक्षण किया गया था

Python3 में एक स्ट्रिंग से सभी स्पेस को स्ट्रिप करने के लिए आप निम्न फ़ंक्शन का उपयोग कर सकते हैं:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

किसी भी व्हाट्सएप वर्ण ('\ t \ n \ r \ x0b \ x0c') को निकालने के लिए आप निम्नलिखित नाम का उपयोग कर सकते हैं:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

व्याख्या

पायथन की str.translateविधि एक अंतर्निहित वर्ग विधि है, यह एक तालिका लेता है और पारित अनुवाद तालिका के माध्यम से मैप किए गए प्रत्येक वर्ण के साथ स्ट्रिंग की एक प्रति लौटाता है। Str.translate के लिए पूर्ण प्रलेखन

अनुवाद तालिका बनाने के लिए str.maketransउपयोग किया जाता है। यह विधि एक अन्य अंतर्निहित वर्ग विधि है str। यहां हम इसका उपयोग केवल एक पैरामीटर के साथ करते हैं, इस मामले में एक शब्दकोश, जहां चाबियाँ चरित्रों को मैप करने के लिए अक्षरों के प्रतिस्थापन मूल्य के साथ बदल दी जाती हैं। यह उपयोग के लिए एक अनुवाद तालिका देता है str.translateStr.maketrans के लिए पूर्ण प्रलेखन

stringअजगर में मॉड्यूल कुछ सामान्य स्ट्रिंग आपरेशन और स्थिरांक होता है। string.whitespaceएक स्थिरांक है जो सभी ASCII वर्णों वाला एक स्ट्रिंग देता है जिसे व्हाट्सएप माना जाता है। इसमें वर्ण स्थान, टैब, लाइनफ़ीड, रिटर्न, फ़ॉर्मफ़ीड और वर्टिकल टैब शामिल हैं। स्ट्रिंग के लिए पूर्ण प्रलेखन

दूसरे फ़ंक्शन dict.fromkeysमें एक शब्दकोश बनाने के लिए उपयोग किया जाता है जहां कुंजी स्ट्रिंग में वर्ण होते हैं जो string.whitespaceप्रत्येक के मूल्य के साथ लौटाए जाते हैं Noneतानाशाही के लिए पूर्ण प्रलेखन


0

यदि इष्टतम प्रदर्शन की आवश्यकता नहीं है और आप बस कुछ आसान मृत चाहते हैं, तो आप "isspace" विधि में निर्मित स्ट्रिंग वर्ग का उपयोग करके प्रत्येक वर्ण का परीक्षण करने के लिए एक मूल फ़ंक्शन को परिभाषित कर सकते हैं:

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

no_white_spaceस्ट्रिंग का निर्माण इस तरह से आदर्श प्रदर्शन नहीं होगा, लेकिन समाधान को समझना आसान है।

>>> remove_space('strip my spaces')
'stripmyspaces'

यदि आप किसी फ़ंक्शन को परिभाषित नहीं करना चाहते हैं, तो आप इसे सूची समझ से समान रूप से परिवर्तित कर सकते हैं। शीर्ष उत्तर के joinसमाधान से उधार लेना :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.