Làm thế nào để loại bỏ tất cả khoảng trắng từ chuỗi


179

Làm cách nào để tách tất cả các khoảng trắng trong chuỗi python? Ví dụ, tôi muốn một chuỗi như strip my spacesđược biến thành stripmyspaces, nhưng dường như tôi không thể thực hiện được điều đó với strip():

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

13
Lưu ý rằng str.strip chỉ ảnh hưởng đến khoảng trắng hàng đầu và dấu.

Câu trả lời:


311

Lợi dụng hành vi của str.split không có tham số sep:

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

Nếu bạn chỉ muốn xóa khoảng trắng thay vì tất cả khoảng trắng:

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

Tối ưu hóa sớm

Mặc dù hiệu quả không phải là mục tiêu chính mà Viết mã rõ ràng là mã ở đây là một số thời gian ban đầu:

$ 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

Lưu ý regex được lưu trữ, vì vậy nó không chậm như bạn tưởng tượng. Biên dịch nó trước sẽ giúp một số, nhưng sẽ chỉ quan trọng trong thực tế nếu bạn gọi nó nhiều lần:

$ 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

Mặc dù re.sub chậm hơn 11,3 lần, hãy nhớ rằng nút cổ chai của bạn được đảm bảo ở nơi khác. Hầu hết các chương trình sẽ không nhận thấy sự khác biệt giữa bất kỳ 3 lựa chọn này.


Nó có thể chậm hơn \s+thay thế. Tôi sẽ gắn bó với.
OTZ

@OTZ: Bạn có thể ngạc nhiên, nhưng hãy xem ghi chú "nhớ".

@Roger Hmm. hấp dẫn. Bạn đã thử s.translatephương pháp nào chưa? Nó có thể đánh bại tất cả các phương pháp hiển thị trên trang này.
OTZ

@Roger Pate: Bạn không cần đối số 'bảng' để dịch, nó có thể None- mặc dù, đáng ngạc nhiên, điều đó làm cho nó chậm hơn ...
martineau

1
Hãy thử myString.translate(None, " \t\r\n\v"). Nó chỉ mất 83% miễn là kỹ thuật (chia và tham gia) nhanh nhất của Roger. Không chắc chắn nếu nó bao gồm tất cả các ký tự khoảng trắng phân tách, nhưng có lẽ nó sẽ đủ cho hầu hết các ứng dụng ASCII.
brianmearn

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

Cũng xử lý bất kỳ ký tự khoảng trắng nào mà bạn không nghĩ tới (tin tôi đi, có rất nhiều).


3
Đây là rất ít hacky của một giải pháp sau đó câu trả lời được chấp nhận.
John Smith

Điều này rõ ràng hơn các câu trả lời khác, vì vậy nó lấy bánh cho tôi.
Tristan

34

Ngoài ra,

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

Và đây là phiên bản Python3:

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

Điều này có vẻ như pythonic nhất. Tại sao nó không được đưa lên hàng đầu?
rbp

Mã Python 3 trong câu trả lời không hoạt động. Nhận xét từ @DanMenes đã lỗi thời
igo

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

@ZelphirKaltstahl bạn cầnimport string
Shahryar Saljoughi

13

Đơn giản nhất là sử dụng thay thế:

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

Ngoài ra, sử dụng một biểu thức thông thường:

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

10

Xóa các không gian bắt đầu trong Python

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

Xóa các không gian lưu trữ hoặc kết thúc trong Python

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

Xóa các WhiteSpaces khỏi Bắt đầu và kết thúc chuỗi trong Python

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

Xóa tất cả các khoảng trống trong python

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

3

Hãy thử một regex với re.sub . Bạn có thể tìm kiếm tất cả các khoảng trắng và thay thế bằng một chuỗi trống.

\strong mẫu của bạn sẽ khớp với các ký tự khoảng trắng - và không chỉ là khoảng trắng (tab, dòng mới, v.v.). Bạn có thể đọc thêm về nó trong hướng dẫn .


Tôi không biết cách sử dụng regexes :(
tên người dùng sai

@wrongusername: Được cập nhật với một liên kết đến trang hướng dẫn mô-đun lại.
Matthew Iselin

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

3
Chào mừng đến với SO. Mặc dù chúng tôi cảm ơn bạn vì câu trả lời của bạn, nhưng sẽ tốt hơn nếu nó cung cấp giá trị bổ sung trên đầu các câu trả lời khác. Trong trường hợp này, câu trả lời của bạn không cung cấp giá trị bổ sung, vì một người dùng khác đã đăng giải pháp đó. Nếu câu trả lời trước đó hữu ích cho bạn, bạn nên bỏ phiếu khi bạn có đủ danh tiếng
Maximilian Peters

Điều này không trả lời câu hỏi "làm thế nào để loại bỏ tất cả khoảng trắng". Nó chỉ xóa khoảng trắng
Nick

2

Như được đề cập bởi Roger Pate, đoạn mã sau đây đã làm việc cho tôi:

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

Tôi đang sử dụng Jupyter Notebook để chạy mã sau:

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

Các kỹ thuật tiêu chuẩn để lọc danh sách được áp dụng, mặc dù chúng không hiệu quả bằng split/joinhoặctranslate phương pháp.

Chúng ta cần một bộ khoảng trắng:

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

Nội dung filter:

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

Một sự hiểu biết danh sách (có, sử dụng dấu ngoặc: xem điểm chuẩn bên dưới):

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

Không biết:

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

Điểm chuẩn:

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

Giải pháp này đã được thử nghiệm bằng Python 3.6

Để loại bỏ tất cả các khoảng trắng từ một chuỗi trong Python3, bạn có thể sử dụng hàm sau:

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

Để xóa mọi ký tự khoảng trắng ('\ t \ n \ r \ x0b \ x0c'), bạn có thể sử dụng chức năng sau:

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

Giải trình

str.translatePhương thức của Python là một phương thức lớp dựng sẵn của str, nó lấy một bảng và trả về một bản sao của chuỗi với mỗi ký tự được ánh xạ qua bảng dịch đã qua.Tài liệu đầy đủ cho str.translate

Để tạo bảng dịch str.maketransđược sử dụng. Phương thức này là một phương thức lớp tích hợp khác của str. Ở đây chúng ta chỉ sử dụng nó với một tham số, trong trường hợp này là một từ điển, trong đó các khóa là các ký tự được thay thế ánh xạ thành các giá trị với giá trị thay thế các ký tự. Nó trả về một bảng dịch để sử dụng với str.translate. Tài liệu đầy đủ cho str.maketrans

Các stringmô-đun trong python chứa một số hoạt động chuỗi thông thường và hằng số. string.whitespacelà hằng số trả về một chuỗi chứa tất cả các ký tự ASCII được coi là khoảng trắng. Điều này bao gồm không gian ký tự, tab, nguồn cấp dữ liệu, trả về, biểu mẫu và tab dọc. Tài liệu đầy đủ cho chuỗi

Trong hàm thứ hai dict.fromkeysđược sử dụng để tạo một từ điển trong đó các khóa là các ký tự trong chuỗi được trả về bởi string.whitespacemỗi giá trị None. Tài liệu đầy đủ cho dict.fromkeys


0

Nếu hiệu suất tối ưu không phải là một yêu cầu và bạn chỉ muốn một cái gì đó đơn giản, bạn có thể xác định một hàm cơ bản để kiểm tra từng ký tự bằng cách sử dụng phương thức "isspace" được xây dựng trong lớp chuỗi:

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

Xây dựng no_white_spacechuỗi theo cách này sẽ không có hiệu suất lý tưởng, nhưng giải pháp rất dễ hiểu.

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

Nếu bạn không muốn xác định hàm, bạn có thể chuyển đổi hàm này thành một thứ tương tự mơ hồ với việc hiểu danh sách. Mượn từ joingiải pháp trả lời hàng đầu :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.