Boşluğu bir dizeden nasıl kesebilirim?


1155

Python'daki bir dizeden baştaki ve sondaki boşlukları nasıl kaldırabilirim?

Örneğin:

" Hello " --> "Hello"
" Hello"  --> "Hello"
"Hello "  --> "Hello"
"Bob has a cat" --> "Bob has a cat"

17
Bu soru beni işten meslektaşları ile 3 dakika boyunca soyma hakkında konuşturarak. Herkes aracılığıyla yarı yolda katılmadan onlar hepimiz biraz gece işlerini sanıyordum.
Whitecat

Yanıtlar:


1735

Sadece bir boşluk mu yoksa ardışık tüm boşluklar mı? İkincisi, o zaman dizelerin zaten bir .strip()yöntemi var:

>>> ' Hello '.strip()
'Hello'
>>> ' Hello'.strip()
'Hello'
>>> 'Bob has a cat'.strip()
'Bob has a cat'
>>> '   Hello   '.strip()  # ALL consecutive spaces at both ends removed
'Hello'

Bununla birlikte, yalnızca bir alanı kaldırmanız gerekiyorsa, bunu aşağıdakilerle yapabilirsiniz:

def strip_one_space(s):
    if s.endswith(" "): s = s[:-1]
    if s.startswith(" "): s = s[1:]
    return s

>>> strip_one_space("   Hello ")
'  Hello'

Ayrıca, str.strip()diğer boşluk karakterlerini de kaldırdığına dikkat edin (örn. Sekmeler ve yeni satırlar). Yalnızca boşlukları kaldırmak için, kaldırılacak karakteri bağımsız değişken olarak belirtebilirsiniz strip, yani:

>>> "  Hello\n".strip(" ")
'Hello\n'

19
Şerit işlevine, örneğin bir harita işlevine ihtiyacınız varsa, str.strip () üzerinden, buna benzer harita (str.strip, collection_of_s) üzerinden erişebilirsiniz
Ward

1
Beyaz boşlukları sadece uçlardan kesmenin bir yolu var mı?
Nikhil Girraj

2
@killthrush Referans için teşekkürler, ancak rstrip()işlevi kastettiğini düşünüyorum . :-)
Nikhil Girraj

14
- piton bilerek iyi kabul ve anlamlı adlar önler gibi Bazen dillerin büyük çoğunluğu "benzersiz" ve "farklı" olmak için kullandıkları hissetmek stripyerine trim, isinstanceyerine instanceof, listyerine array, vs, vs. Neden sadece kullanım herkesin bildiği isimler ?? geez: P
Gershom

3
@GershomMaes'ın stripdurumunda, tamamen katılıyorum, ancak bir liste bir diziden tamamen farklı.
JFA

262

Yukarıdaki cevaplarda belirtildiği gibi

myString.strip()

\ n, \ r, \ t, \ f, boşluk gibi tüm önde gelen ve sondaki boşluk karakterlerini kaldıracaktır.

Daha fazla esneklik için aşağıdakileri kullanın

  • Yalnızca önde gelen boşluk karakterlerini kaldırır :myString.lstrip()
  • Yalnızca sondaki boşluk karakterlerini kaldırır :myString.rstrip()
  • Kaldırır belirli boşluk karakter: myString.strip('\n')ya myString.lstrip('\n\r')ya myString.rstrip('\n\t')vb.

Dokümanlar'da daha fazla ayrıntı mevcuttur


inanıyorum \ r \ n değil \ n \ r ... (yazı düzenleyemezsiniz - yeterli karakter değiştirilmedi)
StefanNch

8
@StefanNch: Karakterlerin sırası hiç önemli değil. \ n \ r \ r \ n öğesini de kaldıracak.
Johannes Overmann

122

strip boşluk karakterleriyle de sınırlı değildir:

# remove all leading/trailing commas, periods and hyphens
title = title.strip(',.-')

54

Bu işlem, aşağıdaki tüm önde gelen ve sondaki boşlukları kaldıracaktır myString:

myString.strip()

3
Bu yazıda sadece kod vardır, fonksiyonun ne yaptığını açıklamaz. Öndeki veya arkadaki boşlukları veya her ikisini de kaldırıyor mu? Sadece boşlukları veya her türlü boşluğu kaldırıyor mu? O zaman sadece boşlukları kaldırabilir misiniz, ya da başka bir işlevi var mı? Hem önde gelen hem de arkadaki boşlukları kaldırırsa, ikisinden yalnızca birini kaldırabilir veya işi yapmak için başka bir işlev (ler) var mı? myString.strip()belirttiğim sorulardan hiçbirine cevap vermiyor.
EKons

8
Adil olmak gerekirse, OP özellikle bir dizeden önde gelen ve arkadaki boşlukları kaldıran bir yöntem istedi. Bana yeterince iyi bir cevap
Denis Lins

21

Şerit () istiyorsunuz:

myphrases = [ " Hello ", " Hello", "Hello ", "Bob has a cat" ]

for phrase in myphrases:
    print phrase.strip()

0

Bir dizede çok fazla boşluk kaldırmak istedim (aynı zamanda dize arasında, sadece başlangıç ​​veya bitiş). Bunu yaptım, çünkü başka türlü nasıl yapacağımı bilmiyorum:

string = "Name : David         Account: 1234             Another thing: something  " 

ready = False
while ready == False:
    pos = string.find("  ")
    if pos != -1:
       string = string.replace("  "," ")
    else:
       ready = True
print(string)

Bu, artık çift boşluk kalmayıncaya kadar bir boşluktaki çift boşlukların yerini alır


Bu işe yarıyor olsa da, çok verimli değil, bunun yerine şunu kullanın: stackoverflow.com/a/2077906/1240286
Arklur

0

Aradığım şeye bir çözüm bulamadım, bu yüzden bazı özel fonksiyonlar yarattım. Onları deneyebilirsiniz.

def cleansed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    # return trimmed(s.replace('"', '').replace("'", ""))
    return trimmed(s)


def trimmed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    ss = trim_start_and_end(s).replace('  ', ' ')
    while '  ' in ss:
        ss = ss.replace('  ', ' ')
    return ss


def trim_start_and_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    return trim_start(trim_end(s))


def trim_start(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in s:
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(chars).lower()


def trim_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in reversed(s):
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(reversed(chars)).lower()


s1 = '  b Beer '
s2 = 'Beer  b    '
s3 = '      Beer  b    '
s4 = '  bread butter    Beer  b    '

cdd = trim_start(s1)
cddd = trim_end(s2)
clean1 = cleansed(s3)
clean2 = cleansed(s4)

print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s1, len(s1), cdd, len(cdd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s2, len(s2), cddd, len(cddd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s3, len(s3), clean1, len(clean1)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s4, len(s4), clean2, len(clean2)))

0

Belirtilen sayıda alanı soldan ve sağdan kırpmak istiyorsanız , bunu yapabilirsiniz:

def remove_outer_spaces(text, num_of_leading, num_of_trailing):
    text = list(text)
    for i in range(num_of_leading):
        if text[i] == " ":
            text[i] = ""
        else:
            break

    for i in range(1, num_of_trailing+1):
        if text[-i] == " ":
            text[-i] = ""
        else:
            break
    return ''.join(text)

txt1 = "   MY name is     "
print(remove_outer_spaces(txt1, 1, 1))  # result is: "  MY name is    "
print(remove_outer_spaces(txt1, 2, 3))  # result is: " MY name is  "
print(remove_outer_spaces(txt1, 6, 8))  # result is: "MY name is"

0

Bu, düzenli bir ifade ile de yapılabilir

import re

input  = " Hello "
output = re.sub(r'^\s+|\s+$', '', input)
# output = 'Hello'

0

Python'daki bir dizeden baştaki ve sondaki boşlukları nasıl kaldırabilirim?

Bu nedenle aşağıdaki çözüm, ön ve arka boşlukları ve ara boşlukları da kaldıracaktır. Birden çok boşluk olmadan net bir dize değerleri almanız gerekiyorsa olduğu gibi.

>>> str_1 = '     Hello World'
>>> print(' '.join(str_1.split()))
Hello World
>>>
>>>
>>> str_2 = '     Hello      World'
>>> print(' '.join(str_2.split()))
Hello World
>>>
>>>
>>> str_3 = 'Hello World     '
>>> print(' '.join(str_3.split()))
Hello World
>>>
>>>
>>> str_4 = 'Hello      World     '
>>> print(' '.join(str_4.split()))
Hello World
>>>
>>>
>>> str_5 = '     Hello World     '
>>> print(' '.join(str_5.split()))
Hello World
>>>
>>>
>>> str_6 = '     Hello      World     '
>>> print(' '.join(str_6.split()))
Hello World
>>>
>>>
>>> str_7 = 'Hello World'
>>> print(' '.join(str_7.split()))
Hello World

Gördüğünüz gibi, bu dizedeki tüm çoklu boşlukları kaldıracaktır (çıktı Hello Worldherkes içindir). Konum önemli değil. Ama gerçekten lider ve arka boşluklara ihtiyacınız varsa, o strip()zaman bulmak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.