Xóa tất cả khoảng trắng trong chuỗi


788

Tôi muốn loại bỏ tất cả khoảng trắng khỏi một chuỗi, ở cả hai đầu và ở giữa các từ.

Tôi có mã Python này:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

Nhưng điều đó chỉ loại bỏ khoảng trắng ở cả hai phía của chuỗi. Làm cách nào để xóa tất cả khoảng trắng?


4
Kết quả của bạn sẽ như thế nào? hello apple? helloapple?
Mark Byers

4
@JoachimPileborg, không chính xác như tôi nghĩ, bởi vì đó cũng là về khoảng trắng giữa các từ.
wal-o-mat

3
helloapple cần là đầu ra của tôi
co2f2e

8
Sửa lỗi cho tôi nếu sai, nhưng "khoảng trắng" không đồng nghĩa với "ký tự khoảng trắng". Câu trả lời hiện tại được đánh dấu là chính xác không xóa tất cả khoảng trắng . Nhưng, vì nó được đánh dấu là chính xác, nó phải trả lời câu hỏi dự định? Vậy chúng ta nên chỉnh sửa câu hỏi để phản ánh câu trả lời được chấp nhận? @Kalanamith Bạn đã, hoặc làm, bạn muốn xóa tất cả khoảng trắng hoặc chỉ khoảng trắng?
AnnanFay

Câu trả lời:


1659

Nếu bạn muốn xóa khoảng trắng đầu và cuối, hãy sử dụng str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

Nếu bạn muốn xóa tất cả các ký tự khoảng trắng, hãy sử dụng str.replace():

(NB điều này chỉ loại bỏ ký tự không gian ASCII bình thường của MSN ' ' U+0020chứ không xóa bất kỳ khoảng trắng nào khác )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

Nếu bạn muốn xóa các không gian trùng lặp, sử dụng str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'

42
Sự tuyệt vời của chức năng này là nó cũng loại bỏ '\ r \ n' khỏi tệp html tôi nhận được từ Beautiful Soup.
luy

27
Tôi thích "" .join (câu.split ()), điều này loại bỏ tất cả khoảng trắng (dấu cách, tab, dòng mới) từ bất kỳ đâu trong câu.
don

người ăn xin ở đây. Ai đó có thể giải thích cho tôi tại sao in (câu.join (câu.split ())) kết quả thành 'xin chào xin chào'? Chỉ muốn hiểu làm thế nào mã được xử lý ở đây.
Yannis Dran

2
@YannisDran kiểm tra tài liệu str.join () , khi bạn gọi sentence.join(str_list)bạn yêu cầu python tham gia các mục từ str_list với sentencedấu phân cách.
Cédric Julien

1
"".join(sentence.split())thực sự là giải pháp kinh điển, loại bỏ hiệu quả tất cả các khoảng trắng thay vì chỉ là khoảng trắng. Câu trả lời xuất sắc của Mark Byers có lẽ đã được chấp nhận thay cho câu trả lời ít áp dụng này.
Cecil Curry

263

Để chỉ xóa khoảng trắng, hãy sử dụng str.replace:

sentence = sentence.replace(' ', '')

Để xóa tất cả các ký tự khoảng trắng (dấu cách, tab, dòng mới, v.v.), bạn có thể sử dụng splitsau đó join:

sentence = ''.join(sentence.split())

hoặc một biểu thức chính quy:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

Nếu bạn muốn chỉ xóa khoảng trắng từ đầu và cuối, bạn có thể sử dụng strip:

sentence = sentence.strip()

Bạn cũng có thể sử dụng lstripđể xóa khoảng trắng chỉ từ đầu chuỗi và rstripđể xóa khoảng trắng khỏi cuối chuỗi.


Lưu ý: Bạn không cần phải biên dịch bước, re.sub (và bạn bè) lưu mẫu đã biên dịch. Xem thêm, câu trả lời của Emil .
Andy Hayden

python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392

104

Một cách khác là sử dụng các biểu thức thông thường và khớp các ký tự khoảng trắng lạ này . Dưới đây là một số ví dụ:

Xóa TẤT CẢ khoảng trắng trong một chuỗi, ngay cả giữa các từ:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

Xóa khoảng trắng trong BẮT ĐẦU của chuỗi:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

Xóa khoảng trắng trong END của chuỗi:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

Xóa các khoảng trắng cả trong BẮT ĐẦU và trong KẾT THÚC của chuỗi:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

Xóa CHỈ không gian DUPLICATE:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(Tất cả các ví dụ hoạt động trong cả Python 2 và Python 3)


Không hoạt động cho "\ u202a1234 \ u202c". Cung cấp cùng một đầu ra: u '\ u202a1234 \ u202c'
Sarang

@Sarang: Đó không phải là các ký tự khoảng trắng (google chúng và bạn sẽ thấy) mà là "Dấu chấm câu chung". Câu trả lời của tôi chỉ liên quan đến việc loại bỏ các ký tự được phân loại là khoảng trắng.
Emil Stenström

Đây là giải pháp duy nhất tôi thấy ở đây để loại bỏ các ký tự khoảng trắng unicode chết tiệt đó, cảm ơn fam
CapnShanty

41

Khoảng trắng bao gồm không gian, tab và CRLF . Vì vậy, một chức năng chuỗi thanh lịch và một lớp lót chúng ta có thể sử dụng là str.translate:

Con trăn 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

HOẶC nếu bạn muốn kỹ lưỡng:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Con trăn 2

' hello  apple'.translate(None, ' \n\t\r')

HOẶC nếu bạn muốn kỹ lưỡng:

import string
' hello  apple'.translate(None, string.whitespace)

2
Điều này sẽ không giúp với khoảng trắng Unicode như\xc2\xa0
Suzana

5
ans.translate( None, string.whitespace )chỉ sản xuất builtins.TypeError: translate() takes exactly one argument (2 given)cho tôi. Docs nói rằng đối số là một bảng dịch, xem string.maketrans (). Nhưng xem bình luận của Amnon Harel, bên dưới.
dùng405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Lưu ý: tốt hơn là tạo một biến để lưu bảng chuyển đổi nếu bạn có ý định làm điều này nhiều lần.
Shogan Aversa-Druesne

16

Để xóa khoảng trắng từ đầu và cuối, sử dụng strip.

>> "  foo bar   ".strip()
"foo bar"

1
Câu hỏi đặc biệt yêu cầu loại bỏ tất cả các khoảng trắng và không chỉ ở cuối. Xin hãy chú ý.
Shaya Shafiq

9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK đã chỉ ra phương pháp "dịch" ở trên. Và biến thể này hoạt động với Python 3 (xem phần Hỏi & Đáp này ).


2
Cảm ơn! Hoặc, xxx.translate( { ord(c) :None for c in string.whitespace } )cho sự thấu đáo.
dùng405

7

Hãy cẩn thận:

strip thực hiện một rstrip và lstrip (loại bỏ các khoảng trắng ở đầu và cuối, các tab, trả về và tạo các nguồn cấp dữ liệu, nhưng nó không xóa chúng ở giữa chuỗi).

Nếu bạn chỉ thay thế khoảng trắng và tab, bạn có thể kết thúc bằng các CRLF ẩn xuất hiện để khớp với những gì bạn đang tìm kiếm, nhưng không giống nhau.


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

3
câu hỏi đã loại bỏ tất cả khoảng trắng bao gồm các tab và ký tự dòng mới, đoạn mã này sẽ chỉ xóa các khoảng trắng thông thường.
Maximilian Peters

3

Ngoài ra, dải có một số biến thể:

Xóa khoảng trắng trong BẮT ĐẦU và KẾT THÚC của chuỗi:

sentence= sentence.strip()

Xóa khoảng trắng trong BẮT ĐẦU của chuỗi:

sentence = sentence.lstrip()

Xóa khoảng trắng trong END của chuỗi:

sentence= sentence.rstrip()

Tất cả ba hàm chuỗi strip lstriprstripcó thể lấy tham số của chuỗi để tách, với mặc định là tất cả khoảng trắng. Điều này có thể hữu ích khi bạn đang làm việc với một cái gì đó cụ thể, ví dụ, bạn chỉ có thể xóa các khoảng trắng nhưng không phải dòng mới:

" 1. Step 1\n".strip(" ")

Hoặc bạn có thể xóa dấu phẩy thừa khi đọc trong danh sách chuỗi:

"1,2,3,".strip(",")

1

loại bỏ tất cả các khoảng trắng từ một chuỗi, ở cả hai đầu và ở giữa các từ.

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Tài liệu Python:


Tôi biết ređã được đề xuất trước đây, nhưng tôi thấy rằng câu trả lời thực sự cho tiêu đề câu hỏi hơi bị ẩn trong số tất cả các tùy chọn khác.
xử lý
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.