क्या एक स्ट्रिंग में कई रिक्त स्थान निकालने का एक सरल तरीका है?


390

मान लीजिए इस तार:

The   fox jumped   over    the log.

में बदलना:

The fox jumped over the log.

इसे प्राप्त करने के लिए सबसे सरल (1-2 लाइनें) क्या है, बिना विभाजन और सूचियों में जाने के लिए?


22
सूचियों में आपका विरोध क्या है? वे भाषा का एक अभिन्न अंग हैं, और "" .join (list_of_words) एक एकल स्थान-सीमांकित स्ट्रिंग में स्ट्रिंग की सूची बनाने के लिए मुख्य मुहावरों में से एक है।
पॉलएमसीजी

3
@ टॉम / @ पॉल: सरल स्ट्रिंग्स के लिए, (स्ट्रिंग) जॉइन सरल और मीठा होगा। लेकिन यह अधिक जटिल हो जाता है अगर कोई अन्य व्हाट्सएप है जो किसी को परेशान नहीं करना चाहता है ... जिस स्थिति में "जबकि" या रेगेक्स समाधान सबसे अच्छा होगा। मैंने एक स्ट्रिंग-जॉइन के नीचे पोस्ट किया है जो "सही" होगा, ऐसा करने के तीन तरीकों के लिए समयबद्ध परीक्षा परिणाम।
२१:४३ पर अजगर

जवाबों:


529
>>> import re
>>> re.sub(' +', ' ', 'The     quick brown    fox')
'The quick brown fox'

20
यह समाधान केवल एकल अंतरिक्ष वर्णों को संभालता है। यह nsr81 के समाधान की तरह एक टैब या अन्य व्हाट्सएप वर्णों को नहीं बदलेगा।
टेलर लेइस

2
यह सच है, string.splitसभी प्रकार के व्हाट्सएप भी संभालता है।
जोश ली

6
मैं इसे पसंद करता हूं क्योंकि यह केवल अंतरिक्ष चरित्र पर केंद्रित है और 'n' जैसे पात्रों को प्रभावित नहीं करता है।
hhsaffar

2
हा सही है। लेकिन उससे पहले पट्टी () की जानी चाहिए। यह दोनों छोर से रिक्त स्थान निकाल देगा।
हार्दिक पटेल

17
आप एकल-स्थान के साथ एकल-स्थान के अनावश्यक प्रतिस्थापनre.sub(' {2,}', ' ', 'The quick brown fox') को रोकने के लिए उपयोग कर सकते हैं ।
aneesAhmed777

541

foo आपका तार है:

" ".join(foo.split())

हालांकि यह हटा देगा "सभी खाली स्थान के वर्ण (अंतरिक्ष, टैब, न्यू लाइन, वापसी, formfeed)" चेतावनी दी (धन्यवाद करने के लिए hhsaffar , टिप्पणी देखें)। यानी, "this is \t a test\n"प्रभावी रूप से समाप्त हो जाएगा "this is a test"


19
"बंटवारे और सूचियों में जाने के बिना ..."
Gumbo

72
मैंने "बिना विभाजन के और सूचियों में जाने ..." को नजरअंदाज कर दिया क्योंकि मुझे अभी भी लगता है कि यह सबसे अच्छा जवाब है।
टेलर लेसे

1
यह ट्रेलिंग स्पेस को हटाता है। यदि आप उन्हें रखना चाहते हैं: टेक्स्ट [0: 1] + ""। जॉइन (टेक्स्ट [1: -1] .split ()) + टेक्स्ट [-1]
user984003

Re.sub () समाधान की तुलना में 6 गुना तेज।
nerdfever.com

1
@ एस्ट्राउरोवा-सैटर्न के अभिनेता मैंने इसे प्रोफाइल किया।
nerdfever.com

85
import re
s = "The   fox jumped   over    the log."
re.sub("\s\s+" , " ", s)

या

re.sub("\s\s+", " ", s)

चूंकि अल्पविराम से पहले अंतरिक्ष पीईपी 8 में एक पालतू जानवर के रूप में सूचीबद्ध है , जैसा कि उपयोगकर्ता मार्टिन थोमा ने टिप्पणियों में उल्लेख किया है


2
मैं उस रेगेक्स को बदलना चाहूंगा r"\s\s+"ताकि वह पहले से सिंगल स्पेस को बदलने की कोशिश न करे।
बेन ब्लैंक

19
यदि आप उस व्यवहार को चाहते थे, तो केवल "\s{2,}"मध्यम-उन्नत रेगेक्स व्यवहार को न जानने के लिए वर्कअराउंड के बजाय क्यों ?
क्रिस लुट्ज़

2
याद रखें कि उप () इनपुट स्ट्रिंग को नहीं बदलता है s, लेकिन नया मान लौटाता है।
gcb

1
@moose - यह एक प्रदर्शन की तुलना में एक पठनीयता अनुकूलन है। \s+" एक स्थान के साथ एक या एक से अधिक रिक्त स्थान को " पढ़ने के लिए लाइन का कारण होगा , बजाय " एक स्थान के साथ दो या अधिक रिक्त स्थान को बदलने के लिए "। पूर्व मुझे तुरंत रोक देता है और सोचता है कि "एक स्थान को एक स्थान से क्यों बदला जाए? यह मूर्खतापूर्ण है।" मेरे लिए, यह एक (बहुत मामूली) कोड गंध है। मैं वास्तव में दोनों के बीच किसी भी प्रदर्शन अंतर होने की उम्मीद नहीं करूंगा, क्योंकि यह वैसे भी एक नए स्ट्रिंग में कॉपी होने जा रहा है, और जहां अंतरिक्ष से कॉपी किया जा रहा है, वहां रुकना और परीक्षण करना है
बेन ब्लैंक

8
मैं इसके खिलाफ सलाह \s\s+दूंगा क्योंकि यह एक TAB चरित्र को सामान्य स्थान पर वापस नहीं लाएगा। एक स्थान + टैब इस तरह से बदल जाता है।
vdboor

51

"\" के साथ रेगीक्स का उपयोग करना और सरल string.split () का प्रयोग अन्य व्हाट्सएप को भी हटा देगा - जैसे कि newlines, गाड़ी का रिटर्न, टैब। जब तक यह वांछित है, के लिए केवल करना कई रिक्त स्थान , मैं इन उदाहरणों प्रस्तुत करते हैं।

मैंने यथार्थवादी समय परीक्षणों को प्राप्त करने के लिए 11 पैराग्राफ, 1000 शब्द, 6665 बाइट्स लोरम इप्सम का उपयोग किया और इसके लिए यादृच्छिक-लंबाई वाले रिक्त स्थान का उपयोग किया:

original_string = ''.join(word + (' ' * random.randint(1, 10)) for word in lorem_ipsum.split(' '))

वन-लाइनर अनिवार्य रूप से किसी भी अग्रणी / अनुगामी रिक्त स्थान की एक पट्टी करेगा, और यह एक अग्रणी / अनुगामी स्थान को संरक्षित करता है (लेकिन केवल ONE ;-)।

# setup = '''

import re

def while_replace(string):
    while '  ' in string:
        string = string.replace('  ', ' ')

    return string

def re_replace(string):
    return re.sub(r' {2,}' , ' ', string)

def proper_join(string):
    split_string = string.split(' ')

    # To account for leading/trailing spaces that would simply be removed
    beg = ' ' if not split_string[ 0] else ''
    end = ' ' if not split_string[-1] else ''

    # versus simply ' '.join(item for item in string.split(' ') if item)
    return beg + ' '.join(item for item in split_string if item) + end

original_string = """Lorem    ipsum        ... no, really, it kept going...          malesuada enim feugiat.         Integer imperdiet    erat."""

assert while_replace(original_string) == re_replace(original_string) == proper_join(original_string)

#'''

# while_replace_test
new_string = original_string[:]

new_string = while_replace(new_string)

assert new_string != original_string

# re_replace_test
new_string = original_string[:]

new_string = re_replace(new_string)

assert new_string != original_string

# proper_join_test
new_string = original_string[:]

new_string = proper_join(new_string)

assert new_string != original_string

नोट: " whileसंस्करण" की एक प्रति बनाई गई original_string, जैसा कि मेरा मानना ​​है कि पहले रन पर एक बार संशोधित होने के बाद, क्रमिक रन तेजी से होगा (यदि केवल थोड़ा सा)। जैसा कि यह समय जोड़ता है, मैंने इस स्ट्रिंग कॉपी को अन्य दो में जोड़ा ताकि समय केवल तर्क में अंतर दिखाए। ध्यान रखें कि उदाहरणों stmtपर मुख्य timeitकेवल एक बार निष्पादित किया जाएगा ; मूल तरीके से मैंने ऐसा किया, whileलूप ने उसी लेबल पर काम किया original_string, इस प्रकार दूसरा रन, कुछ भी नहीं करना था। जिस तरह से यह अब सेट है, एक फ़ंक्शन को कॉल करना, दो अलग-अलग लेबलों का उपयोग करना, जो एक समस्या नहीं है। मैंने assertसभी श्रमिकों को यह सत्यापित करने के लिए बयान दिए हैं कि हम हर पुनरावृत्ति (जो संदिग्ध हो सकते हैं) के लिए कुछ बदल सकते हैं। उदाहरण के लिए, इसे बदलें और यह टूट गया:

# while_replace_test
new_string = original_string[:]

new_string = while_replace(new_string)

assert new_string != original_string # will break the 2nd iteration

while '  ' in original_string:
    original_string = original_string.replace('  ', ' ')

Tests run on a laptop with an i5 processor running Windows 7 (64-bit).

timeit.Timer(stmt = test, setup = setup).repeat(7, 1000)

test_string = 'The   fox jumped   over\n\t    the log.' # trivial

Python 2.7.3, 32-bit, Windows
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.001066 |   0.001260 |   0.001128 |   0.001092
     re_replace_test |   0.003074 |   0.003941 |   0.003357 |   0.003349
    proper_join_test |   0.002783 |   0.004829 |   0.003554 |   0.003035

Python 2.7.3, 64-bit, Windows
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.001025 |   0.001079 |   0.001052 |   0.001051
     re_replace_test |   0.003213 |   0.004512 |   0.003656 |   0.003504
    proper_join_test |   0.002760 |   0.006361 |   0.004626 |   0.004600

Python 3.2.3, 32-bit, Windows
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.001350 |   0.002302 |   0.001639 |   0.001357
     re_replace_test |   0.006797 |   0.008107 |   0.007319 |   0.007440
    proper_join_test |   0.002863 |   0.003356 |   0.003026 |   0.002975

Python 3.3.3, 64-bit, Windows
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.001444 |   0.001490 |   0.001460 |   0.001459
     re_replace_test |   0.011771 |   0.012598 |   0.012082 |   0.011910
    proper_join_test |   0.003741 |   0.005933 |   0.004341 |   0.004009

test_string = lorem_ipsum
# Thanks to http://www.lipsum.com/
# "Generated 11 paragraphs, 1000 words, 6665 bytes of Lorem Ipsum"

Python 2.7.3, 32-bit
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.342602 |   0.387803 |   0.359319 |   0.356284
     re_replace_test |   0.337571 |   0.359821 |   0.348876 |   0.348006
    proper_join_test |   0.381654 |   0.395349 |   0.388304 |   0.388193    

Python 2.7.3, 64-bit
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.227471 |   0.268340 |   0.240884 |   0.236776
     re_replace_test |   0.301516 |   0.325730 |   0.308626 |   0.307852
    proper_join_test |   0.358766 |   0.383736 |   0.370958 |   0.371866    

Python 3.2.3, 32-bit
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.438480 |   0.463380 |   0.447953 |   0.446646
     re_replace_test |   0.463729 |   0.490947 |   0.472496 |   0.468778
    proper_join_test |   0.397022 |   0.427817 |   0.406612 |   0.402053    

Python 3.3.3, 64-bit
                test |      minum |    maximum |    average |     median
---------------------+------------+------------+------------+-----------
  while_replace_test |   0.284495 |   0.294025 |   0.288735 |   0.289153
     re_replace_test |   0.501351 |   0.525673 |   0.511347 |   0.508467
    proper_join_test |   0.422011 |   0.448736 |   0.436196 |   0.440318

तुच्छ स्ट्रिंग के लिए, ऐसा प्रतीत होता है कि थोड़ी देर का लूप सबसे तेज़ है, इसके बाद पायथोनिक स्ट्रिंग-स्प्लिट / जॉइन होता है, और रेगेक्स पीछे की तरफ खींचता है।

गैर-तुच्छ स्ट्रिंग्स के लिए , लगता है कि विचार करने के लिए थोड़ा अधिक है। 32-बिट 2.7? यह बचाव के लिए है! 2.7 64-बिट? एक whileलूप सबसे अच्छा है, एक सभ्य मार्जिन द्वारा। 32-बिट 3.2, "उचित" के साथ जाएं join। 64-बिट 3.3, एक whileलूप के लिए जाएं। फिर।

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

  1. इसे काम करने लायक बनाओ
  2. इसको सही करो
  3. इसे तेज़ी से करें

IANAL, YMMV, कैविट एम्प्टर!


1
मुझे पसंद होता अगर आपने सरल परीक्षण किया होता ' '.join(the_string.split())क्योंकि यह सामान्य उपयोग का मामला है लेकिन मैं आपके काम के लिए धन्यवाद कहना चाहूंगा!
वेदी

@wedi: अन्य टिप्पणी प्रति (से की तरह Gumbo ; user984003 , हालांकि उसकी / उसके समाधान प्रकल्पित है और काम नहीं "सभी मामलों में" होगा), समाधान की इस तरह प्रश्नकर्ता के अनुरोध का पालन नहीं करता। एक .split (''), और एक कॉम्प / जीन का उपयोग कर सकता है, लेकिन सीसा / अनुगामी स्थानों से निपटने के लिए बालों को प्राप्त करता है।
१६:१६ पर अजगर

@wedi: Eg: ' '.join(p for p in s.split(' ') if p)<- अभी भी लीड / ट्रेलिंग स्पेस खो गया है, लेकिन कई स्पेस के लिए जिम्मेदार है। उन्हें रखने के लिए, पसंद करना चाहिए parts = s.split(' '); (' ' if not parts[0] else '') + ' '.join(p for p in s.split(' ') if p) + (' ' if not parts[-1] else '')!
१६

मंत्र के लिए धन्यवाद @pythonlarry! और विस्तृत परीक्षण प्यार करता हूँ! मुझे यह जानने की उत्सुकता है कि क्या आपके विचार या विचार इस पर बदल गए हैं जब से ६ साल हो गए हैं?
JayRizzo

गुम संस्करण जो जनरेटर का उपयोग करते हैं
ली

42

मुझे पॉल मैकगायर की टिप्पणी से सहमत होना होगा। मुझे सम,

' '.join(the_string.split())

एक रेगेक्स को चाबुक मारने के लिए काफी बेहतर है।

मेरे माप (लिनक्स और पायथन 2.5) विभाजन को दिखाते हैं, फिर "re.sub (...)" करने की तुलना में लगभग पांच गुना तेज हो जाते हैं, और यदि आप एक बार regex को दबा देते हैं और ऑपरेशन करते हैं, तब भी तीन गुना तेजी से करते हैं कई बार। और यह किसी भी उपाय को समझना आसान है - बहुत अधिक पायथोनिक।


यह ट्रेलिंग स्पेस को हटाता है। यदि आप उन्हें रखना चाहते हैं: टेक्स्ट [0: 1] + ""। जॉइन (टेक्स्ट [1: -1 .split ()) + टेक्स्ट [-1]
user984003

4
एक साधारण regexp पढ़ना बेहतर है। ज़रूरत से पहले प्रदर्शन के लिए कभी भी अनुकूलन न करें।
gcb

@gcb: क्यों नहीं? क्या होगा यदि आप एक उच्च थ्रूपुट परिदृश्य (जैसे उच्च मांग के कारण) की उम्मीद कर रहे हैं? उस स्थिति में जाने से कम संसाधन गहन होने की उम्मीद क्यों न करें?
हसन बेग

1
@ हसनबाइग यदि आपके पास पहले से ही प्रदर्शन की आवश्यकता है, तो यह वास्तव में समय से पहले अनुकूलन नहीं है, है ना? मेरा कहना यह है कि जब आपको अभी तक प्रदर्शन के बारे में जानने की आवश्यकता नहीं है, तो पठनीयता के लिए लक्ष्य बनाना हमेशा बेहतर होता है।
gcb

14

पिछले समाधानों के समान, लेकिन अधिक विशिष्ट: एक के साथ दो या अधिक रिक्त स्थान बदलें:

>>> import re
>>> s = "The   fox jumped   over    the log."
>>> re.sub('\s{2,}', ' ', s)
'The fox jumped over the log.'

11

एक साधारण आत्मा

>>> import re
>>> s="The   fox jumped   over    the log."
>>> print re.sub('\s+',' ', s)
The fox jumped over the log.

6

आप पंडों डेटाफ्रैम में स्ट्रिंग बंटवारे की तकनीक का उपयोग करने की आवश्यकता के बिना भी उपयोग कर सकते हैं ।apply (..), जो उपयोगी है यदि आपको बड़ी संख्या में स्ट्रिंग्स पर ऑपरेशन जल्दी करने की आवश्यकता है। यहाँ यह एक लाइन पर है:

df['message'] = (df['message'].str.split()).str.join(' ')

6
import re
string = re.sub('[ \t\n]+', ' ', 'The     quick brown                \n\n             \t        fox')

यह एकल सफेद स्थान के साथ सभी टैब, नई लाइनों और कई सफेद रिक्त स्थान को हटा देगा।


लेकिन अगर आपके पास व्हाट्सएप (नॉन-प्रिंट करने योग्य) अक्षर हैं, तो आपकी सीमा में '\ x00' की तरह '\ x0020' नहीं है, तो कोड उन्हें पट्टी नहीं करेगा।
मस्कटाउन

5

मैंने निम्नलिखित विधि की कोशिश की है और यह भी चरम मामले के साथ काम करता है जैसे:

str1='          I   live    on    earth           '

' '.join(str1.split())

लेकिन अगर आप एक नियमित अभिव्यक्ति पसंद करते हैं तो यह किया जा सकता है:

re.sub('\s+', ' ', str1)

हालांकि ट्रेलिंग और स्पेस को समाप्त करने के लिए कुछ प्रीप्रोसेसिंग करना पड़ता है।


3

यह भी काम करने लगता है:

while "  " in s:
    s = s.replace("  ", " ")

जहां चर sआपकी स्ट्रिंग का प्रतिनिधित्व करता है।


2

कुछ मामलों में उस चरित्र के एकल उदाहरण के साथ हर व्हाट्सएप चरित्र की लगातार घटनाओं को बदलना वांछनीय है । आप ऐसा करने के लिए backreferences के साथ एक नियमित अभिव्यक्ति का उपयोग करेंगे।

(\s)\1{1,}किसी भी व्हाट्सएप चरित्र से मेल खाता है, उसके बाद उस चरित्र की एक या अधिक घटनाएँ होती हैं। अब, आपको केवल पहले समूह ( \1) को मैच के प्रतिस्थापन के रूप में निर्दिष्ट करना होगा ।

एक समारोह में इस लपेटकर:

import re

def normalize_whitespace(string):
    return re.sub(r'(\s)\1{1,}', r'\1', string)
>>> normalize_whitespace('The   fox jumped   over    the log.')
'The fox jumped over the log.'
>>> normalize_whitespace('First    line\t\t\t \n\n\nSecond    line')
'First line\t \nSecond line'

2

एक अन्य विकल्प:

>>> import re
>>> str = 'this is a            string with    multiple spaces and    tabs'
>>> str = re.sub('[ \t]+' , ' ', str)
>>> print str
this is a string with multiple spaces and tabs

2

एक वाक्य के भीतर, पहले और बाद में सभी अतिरिक्त रिक्त स्थान निकालने के लिए कोड की एक पंक्ति:

sentence = "  The   fox jumped   over    the log.  "
sentence = ' '.join(filter(None,sentence.split(' ')))

स्पष्टीकरण:

  1. पूरी स्ट्रिंग को एक सूची में विभाजित करें।
  2. सूची से खाली तत्वों को फ़िल्टर करें।
  3. शेष तत्वों को एक ही स्थान के साथ फिर से जोड़ दें

* बचे हुए तत्वों को शब्दों या शब्दों के साथ विराम चिह्नों आदि होना चाहिए। मैंने इसे बड़े पैमाने पर परीक्षण नहीं किया, लेकिन यह एक अच्छा प्रारंभिक बिंदु होना चाहिए। शुभकामनाएं!


2

पायथन डेवलपर्स के लिए समाधान:

import re

text1 = 'Python      Exercises    Are   Challenging Exercises'
print("Original string: ", text1)
print("Without extra spaces: ", re.sub(' +', ' ', text1))

आउटपुट:
Original string: Python Exercises Are Challenging Exercises Without extra spaces: Python Exercises Are Challenging Exercises


1
def unPretty(S):
   # Given a dictionary, JSON, list, float, int, or even a string...
   # return a string stripped of CR, LF replaced by space, with multiple spaces reduced to one.
   return ' '.join(str(S).replace('\n', ' ').replace('\r', '').split())

1

उपयोगकर्ता द्वारा जनित स्ट्रिंग्स के लिए आप सबसे तेज़ हो सकते हैं:

if '  ' in text:
    while '  ' in text:
        text = text.replace('  ', ' ')

शॉर्ट सर्किटिंग यह अजगर के व्यापक उत्तर की तुलना में थोड़ा तेज बनाता है । इसके लिए जाएं यदि आप दक्षता के बाद हैं और एकल अंतरिक्ष विविधता के अतिरिक्त व्हॉट्सएप को सख्ती से देखना चाहते हैं ।


1

बहुत आश्चर्य की बात है - कोई भी साधारण फ़ंक्शन पोस्ट नहीं करता है जो सभी अन्य पोस्ट किए गए समाधानों की तुलना में बहुत तेज़ होगा। ये रहा:

def compactSpaces(s):
    os = ""
    for c in s:
        if c != " " or os[-1] != " ":
            os += c 
    return os


0
string = 'This is a             string full of spaces          and taps'
string = string.split(' ')
while '' in string:
    string.remove('')
string = ' '.join(string)
print(string)

परिणाम :

यह रिक्त स्थान और नल से भरा एक स्ट्रिंग है


0

श्वेत स्थान को हटाने के लिए, शब्दों के बीच में अग्रणी, अनुगामी और अतिरिक्त श्वेत स्थान पर विचार करें, उपयोग करें:

(?<=\s) +|^ +(?=\s)| (?= +[\n\0])

पहला orप्रमुख श्वेत स्थान के साथ है, दूसरा सफ़ेद अंतरिक्ष की orशुरुआत के साथ दूसरा सौदा करता है, और दूसरा अंतिम स्थान श्वेत स्थान के साथ है।

उपयोग के प्रमाण के लिए, यह लिंक आपको एक परीक्षण प्रदान करेगा।

https://regex101.com/r/meBYli/4

इसका उपयोग re.split फ़ंक्शन के साथ किया जाना है।


0

मेरे पास अपनी सरल विधि है जो मैंने कॉलेज में उपयोग की है।

line = "I     have            a       nice    day."

end = 1000
while end != 0:
    line.replace("  ", " ")
    end -= 1

यह हर डबल स्पेस को सिंगल स्पेस से रिप्लेस करेगा और 1000 बार करेगा। इसका मतलब है कि आपके पास 2000 अतिरिक्त स्थान हो सकते हैं और अभी भी काम करेंगे। :)


यह अनाकिमी के उत्तर के समान (व्यावहारिक रूप से) है ( दो वर्ष से अधिक पूर्व पोस्ट किया गया)।
पीटर मोर्टेंसन

0

मैंने बिना विभाजन के एक सरल विधि प्राप्त की है:

a = "Lorem   Ipsum Darum     Diesrum!"
while True:
    count = a.find("  ")
    if count > 0:
        a = a.replace("  ", " ")
        count = a.find("  ")
        continue
    else:
        break

print(a)

1
यह अनाकिमी के उत्तर से कैसे भिन्न है (तीन वर्ष से अधिक पूर्व पोस्ट) ? क्या यह सिर्फ एक अधिक जटिल संस्करण नहीं है?
पीटर मोर्टेंसन

0
import re

Text = " You can select below trims for removing white space!!   BR Aliakbar     "
  # trims all white spaces
print('Remove all space:',re.sub(r"\s+", "", Text), sep='') 
# trims left space
print('Remove leading space:', re.sub(r"^\s+", "", Text), sep='') 
# trims right space
print('Remove trailing spaces:', re.sub(r"\s+$", "", Text), sep='')  
# trims both
print('Remove leading and trailing spaces:', re.sub(r"^\s+|\s+$", "", Text), sep='')
# replace more than one white space in the string with one white space
print('Remove more than one space:',re.sub(' +', ' ',Text), sep='') 

परिणाम:

सभी स्थान निकालें: Youcanselectbelowtrimsforremovingwhitespace !! BRAliakbar प्रमुख स्थान निकालें: आप सफेद स्थान को हटाने के लिए ट्रिम्स के नीचे चयन कर सकते हैं !! BR Aliakbar
ट्रेलिंग स्पेस निकालें: व्हाइट स्पेस हटाने के लिए आप ट्रिम्स के नीचे चयन कर सकते हैं !! BR Aliakbar स्पेसिंग और ट्रेलिंग स्पेस को हटाएं: व्हाइट स्पेस हटाने के लिए आप ट्रिम्स के नीचे सेलेक्ट कर सकते हैं !! BR Aliakbar एक से अधिक स्पेस निकालें: आप व्हाइट स्पेस हटाने के लिए ट्रिम्स के नीचे चयन कर सकते हैं !! बीआर अलीकबार


-1

मैंने अन्य उदाहरणों में बहुत कुछ नहीं पढ़ा है, लेकिन मैंने इस पद्धति को कई लगातार अंतरिक्ष वर्णों को समेकित करने के लिए बनाया है।

यह किसी भी पुस्तकालयों का उपयोग नहीं करता है, और जबकि यह स्क्रिप्ट की लंबाई के संदर्भ में अपेक्षाकृत लंबा है, यह एक जटिल कार्यान्वयन नहीं है:

def spaceMatcher(command):
    """
    Function defined to consolidate multiple whitespace characters in
    strings to a single space
    """
    # Initiate index to flag if more than one consecutive character
    iteration
    space_match = 0
    space_char = ""
    for char in command:
      if char == " ":
          space_match += 1
          space_char += " "
      elif (char != " ") & (space_match > 1):
          new_command = command.replace(space_char, " ")
          space_match = 0
          space_char = ""
      elif char != " ":
          space_match = 0
          space_char = ""
   return new_command

command = None
command = str(input("Please enter a command ->"))
print(spaceMatcher(command))
print(list(spaceMatcher(command)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.