วิธีตัดช่องว่างทั้งหมดออกจากสตริง


179

ฉันจะตัดช่องว่างทั้งหมดในสตริงไพ ธ อนได้อย่างไร ตัวอย่างเช่นฉันต้องการสตริงstrip my spacesที่จะกลายเป็นstripmyspacesแต่ฉันดูเหมือนจะไม่ประสบความสำเร็จด้วยstrip():

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

13
โปรดทราบว่า str.strip มีผลกับช่องว่างนำหน้าและต่อท้ายเท่านั้น

คำตอบ:


311

การใช้ประโยชน์จากพฤติกรรมของ str.split โดยไม่มีพารามิเตอร์ sep:

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

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

$ 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.3 เท่าโปรดจำไว้ว่าคอขวดของคุณจะอยู่ที่อื่นอย่างแน่นอน โปรแกรมส่วนใหญ่จะไม่สังเกตเห็นความแตกต่างระหว่างตัวเลือกใด ๆ 3 ตัวเลือกเหล่านี้


มันอาจช้ากว่าการ\s+ทดแทน ฉันจะติดกับอีกครั้ง
OTZ

@OTZ: คุณอาจจะแปลกใจ แต่เห็นโน้ต "จดจำ"

@Roger อืม น่าสนใจ คุณได้ลองs.translateวิธีโดยบังเอิญหรือไม่? อาจเป็นวิธีการทั้งหมดที่แสดงในหน้านี้
OTZ

@Roger กบาล: คุณไม่จำเป็นต้อง 'table' อาร์กิวเมนต์สำหรับการแปลก็สามารถNone- แม้ว่าแปลกใจที่ทำให้มันช้าลง ...
มาร์ติโน

1
ลองmyString.translate(None, " \t\r\n\v")ดู ใช้เวลาเพียง 83% ตราบใดที่เทคนิค (แยกและเข้าร่วม) ที่รวดเร็วที่สุดของโรเจอร์ ไม่แน่ใจว่าครอบคลุมพื้นที่อักขระสีขาวทั้งหมดที่แยก แต่อาจเพียงพอสำหรับแอปพลิเคชัน ASCII ส่วนใหญ่
brianmearns

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

จัดการกับอักขระช่องว่างใด ๆ ที่คุณไม่ได้คิด (เชื่อฉันมีมากมาย)


3
นี่เป็นวิธีแก้ปัญหาที่น้อยกว่ามากและเป็นคำตอบที่ยอมรับได้
John Smith

นี่เป็นคำตอบที่ชัดเจนกว่าคำตอบอื่น ๆ ดังนั้นจึงต้องใช้เค้กสำหรับฉัน
อุโมงค์

34

อีกวิธีหนึ่งคือ

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

และนี่คือเวอร์ชั่น Python3:

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

ดูเหมือนว่าจะเป็นเสียงไพเราะที่สุด ทำไมมันไม่ถูก upvoted ไปด้านบน?
rbp

คำตอบรหัส Python 3 ใช้งานได้ ความคิดเห็นจาก @DanMenes ล้าสมัยแล้ว
igo

3
NameError: name 'string' is not defined.
Zelphir Kaltstahl

@ZelphirKaltstahl คุณต้องimport string
Shahryar Saljoughi

13

วิธีที่ง่ายที่สุดคือใช้แทนที่:

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

หรือใช้นิพจน์ทั่วไป:

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

10

ลบ Spaces เริ่มต้นใน Python

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

ลบ Trailing หรือ End Spaces ใน Python

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

ลบ whiteSpaces ออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงใน Python

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ในรูปแบบของคุณจะจับคู่อักขระช่องว่าง - และไม่ใช่แค่ช่องว่าง (แท็บขึ้นบรรทัดใหม่ ฯลฯ ) คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในคู่มือ


ฉันไม่ทราบวิธีใช้ regexes :(
ต้อง

@wrongusername: อัปเดตพร้อมลิงก์ไปยังหน้าคู่มือโมดูลใหม่
Matthew Iselin

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

3
ยินดีต้อนรับสู่ SO แม้ว่าเราจะขอบคุณสำหรับคำตอบของคุณมันจะดีกว่าถ้ามันให้คุณค่าเพิ่มเติมกับคำตอบอื่น ๆ ในกรณีนี้คำตอบของคุณไม่ได้ให้คุณค่าเพิ่มเติมเนื่องจากผู้ใช้รายอื่นโพสต์โซลูชันนั้นแล้ว หากคำตอบก่อนหน้านี้มีประโยชน์กับคุณคุณควรโหวตมันเมื่อคุณมีชื่อเสียงมากพอ
Maximilian Peters

วิธีนี้จะไม่ตอบคำถาม "วิธีลบพื้นที่สีขาวทั้งหมด" มันลบช่องว่างเท่านั้น
Nick

2

ดังกล่าวโดย Roger Pate รหัสต่อไปนี้ทำงานสำหรับฉัน

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

ฉันใช้ Jupyter Notebook เพื่อเรียกใช้รหัสต่อไปนี้:

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

TL / DR

วิธีนี้ได้รับการทดสอบโดยใช้ Python 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วิธีการของ Python เป็นวิธีการเรียนในตัวของ str ใช้ตารางและส่งคืนสำเนาของสตริงโดยที่อักขระแต่ละตัวถูกแม็พผ่านตารางการแปลที่ผ่าน เอกสารฉบับเต็มสำหรับ str.translate

เพื่อสร้างตารางการแปลที่str.maketransใช้ strวิธีการนี้ถูกสร้างขึ้นในอีกวิธีการเรียนของ ที่นี่เราใช้กับพารามิเตอร์เดียวเท่านั้นในกรณีนี้พจนานุกรมซึ่งคีย์คืออักขระที่จะถูกแมปกับค่าด้วยค่าการแทนที่อักขระ str.translateก็จะส่งกลับตารางการแปลสำหรับใช้กับ เอกสารฉบับเต็มสำหรับ str.maketrans

stringโมดูลในหลามมีบางส่วนการดำเนินงานร่วมกันสตริงและค่าคงที่ string.whitespaceเป็นค่าคงที่ซึ่งส่งคืนสตริงที่มีอักขระ ASCII ทั้งหมดที่ถูกพิจารณาว่าเป็น whitespace ซึ่งรวมถึงพื้นที่อักขระแท็บ linefeed ย้อนกลับ formfeed และแท็บแนวตั้ง เอกสารเต็มรูปแบบสำหรับสตริง

ในฟังก์ชั่นที่สองdict.fromkeysใช้ในการสร้างพจนานุกรมที่คีย์มีตัวละครในสตริงส่งกลับโดยแต่ละคนมีค่าstring.whitespace เอกสารฉบับเต็มสำหรับ dict.fromkeysNone


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