ฉันจะตัดช่องว่างจากสตริงได้อย่างไร


1155

ฉันจะลบช่องว่างนำหน้าและต่อท้ายจากสตริงใน Python ได้อย่างไร

ตัวอย่างเช่น:

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

17
คำถามนี้เพิ่งให้ฉันพูดคุยกับเพื่อนร่วมงานจากการทำงานเกี่ยวกับการปอกเป็นเวลา 3 นาที สำหรับคนอื่น ๆ ที่เข้าร่วมครึ่งทางพวกเขาคงจะคิดว่าเราทำงานกลางคืนทั้งหมด
Whitecat

คำตอบ:


1735

เพียงแค่หนึ่งช่องว่างหรือช่องว่างต่อเนื่องทั้งหมด? ถ้าวินาทีสตริงจะมี.strip()เมธอดอยู่แล้ว:

>>> ' 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'

หากคุณต้องการลบเพียงหนึ่งช่องว่างคุณสามารถทำได้ด้วย:

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

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

นอกจากนี้โปรดทราบว่าstr.strip()จะลบอักขระช่องว่างอื่น ๆ ออกด้วย (เช่นแท็บและบรรทัดใหม่) หากต้องการลบช่องว่างเท่านั้นคุณสามารถระบุอักขระที่ต้องการลบเป็นอาร์กิวเมนต์stripได้เช่น:

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

19
หากคุณต้องการฟังก์ชั่นสตริปตัวอย่างเช่นฟังก์ชั่นแผนที่คุณสามารถเข้าถึงได้ผ่าน str.strip () เช่นแผนที่ (str.strip, collection_of_s)
Ward

1
มีวิธีการตัดเฉพาะ whitespaces ที่สิ้นสุดหรือไม่
Nikhil Girraj

2
@ killthrush ขอบคุณสำหรับการอ้างอิง แต่ฉันคิดว่าคุณหมายถึงrstrip()ฟังก์ชั่น :-)
Nikhil Girraj

14
บางครั้งฉันรู้สึกเหมือนงูหลามจงใจหลีกเลี่ยงชื่อที่ได้รับการยอมรับและมีความหมายว่าส่วนใหญ่ของภาษาที่ใช้ในการสั่งซื้อที่จะ "ไม่ซ้ำกัน" และ "ที่แตกต่างกัน" - stripแทนtrim, isinstanceแทนinstanceof, listแทนarrayฯลฯ ฯลฯ ทำไมไม่เพียงใช้งาน ชื่อที่ทุกคนคุ้นเคยกับ ?? geez: P
Gershom

3
@GershomMaes ในstripกรณีของฉันเห็นด้วยอย่างสมบูรณ์ แต่รายการแตกต่างจากอาร์เรย์อย่างสิ้นเชิง
JFA

262

ตามที่ระบุไว้ในคำตอบข้างต้น

myString.strip()

จะลบอักขระช่องว่างนำหน้าและต่อท้ายทั้งหมดเช่น \ n, \ r, \ t, \ f, ช่องว่าง

เพื่อความยืดหยุ่นที่มากขึ้นให้ใช้สิ่งต่อไปนี้

  • ลบเฉพาะช่องว่างนำหน้า :myString.lstrip()
  • ลบตัวอักษรช่องว่างต่อท้าย :myString.rstrip()
  • เอาเฉพาะเจาะจงตัวอักษรช่องว่าง: myString.strip('\n')หรือmyString.lstrip('\n\r')หรือmyString.rstrip('\n\t')และอื่น ๆ

รายละเอียดเพิ่มเติมมีอยู่ในเอกสาร


ฉันเชื่อว่าเป็น \ r \ n ไม่ใช่ \ n \ r ... (ไม่สามารถแก้ไขโพสต์ - แก้ไขตัวอักษรไม่เพียงพอ)
StefanNch

8
@StefanNch: ลำดับของตัวละครไม่สำคัญเลย \ n \ r จะลบ \ r \ n ด้วย
Johannes Overmann


54

นี้จะลบทุกชั้นนำและต่อท้ายช่องว่างในmyString:

myString.strip()

3
โพสต์นี้มีรหัสเท่านั้นมันไม่ได้อธิบายสิ่งที่ฟังก์ชั่นทำ มันลบช่องว่างนำหน้าหรือต่อท้ายหรือทั้งสองอย่าง? มันลบเพียงแค่ช่องว่างหรือช่องว่างทุกชนิด? คุณสามารถลบมันออกเป็นที่ว่างได้หรือไม่หรือมีฟังก์ชั่นอื่นให้ทำอีกหรือไม่? หากลบทั้งช่องว่างนำหน้าและต่อท้ายคุณสามารถลบออกเพียงหนึ่งในสองรายการหรือมี / (มี) ฟังก์ชั่นอื่น ๆ เพื่อทำงานหรือไม่ myString.strip()ตอบคำถามที่ฉันไม่ได้ระบุไว้อย่างใดอย่างหนึ่ง
EKons

8
เพื่อความเป็นธรรม OP ได้ขอวิธีการเฉพาะที่จะลบช่องว่างนำหน้าและออกจากสตริง คำตอบที่ดีพอสำหรับฉัน
เดนิส Lins

21

คุณต้องการแถบ ():

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

for phrase in myphrases:
    print phrase.strip()

0

ฉันต้องการลบช่องว่างมากเกินไปในสตริง (รวมถึงระหว่างสตริงไม่เพียง แต่ในตอนต้นหรือตอนท้าย) ฉันทำสิ่งนี้เพราะฉันไม่รู้วิธีการทำอย่างอื่น:

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)

สิ่งนี้จะแทนที่ช่องว่างคู่ในหนึ่งช่องว่างจนกว่าคุณจะไม่มีช่องว่างซ้อนอีกต่อไป


แม้ว่าจะใช้งานได้ แต่ก็ไม่ได้มีประสิทธิภาพมากนักให้ใช้สิ่งนี้แทน: stackoverflow.com/a/2077906/1240286
Arklur

0

ฉันไม่พบวิธีแก้ไขสิ่งที่ฉันค้นหาดังนั้นฉันจึงสร้างฟังก์ชั่นที่กำหนดเอง คุณสามารถลองพวกเขา

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

หากคุณต้องการตัดจำนวนช่องว่างที่ระบุจากซ้ายและขวาคุณสามารถทำได้ดังนี้

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

สิ่งนี้สามารถทำได้ด้วยการแสดงออกปกติ

import re

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

0

ฉันจะลบช่องว่างนำหน้าและต่อท้ายจากสตริงใน Python ได้อย่างไร

ดังนั้นวิธีการแก้ปัญหาด้านล่างจะลบช่องว่างนำหน้าและต่อท้ายรวมทั้งช่องว่างกลางด้วย เช่นถ้าคุณต้องการรับค่าสตริงที่ชัดเจนโดยไม่มีช่องว่างหลายช่อง

>>> 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

ในขณะที่คุณสามารถเห็นสิ่งนี้จะลบช่องว่างหลายช่องทั้งหมดในสตริง (เอาท์พุทHello Worldสำหรับทุกคน) สถานที่ตั้งไม่สำคัญ แต่ถ้าคุณต้องการช่องว่างนำหน้าและต่อท้ายจริงๆแล้วstrip()ก็จะพบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.