Làm cách nào để cắt khoảng trắng từ một chuỗi?


1157

Làm cách nào để xóa khoảng trắng hàng đầu và dấu kiểm khỏi chuỗi trong Python?

Ví dụ:

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

17
Câu hỏi này chỉ cần tôi nói chuyện với các đồng nghiệp từ công việc về tước trong 3 phút. Đối với bất kỳ ai khác tham gia nửa chừng, họ sẽ nghĩ rằng tất cả chúng ta đều làm việc một chút vào ban đêm.
Whitecat

Câu trả lời:


1736

Chỉ cần một không gian, hoặc tất cả các không gian liên tiếp? Nếu thứ hai, thì các chuỗi đã có một .strip()phương thức:

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

Tuy nhiên, nếu bạn chỉ cần xóa một khoảng trắng, bạn có thể thực hiện với:

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

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

Ngoài ra, lưu ý rằng cũng str.strip()loại bỏ các ký tự khoảng trắng khác (ví dụ: tab và dòng mới). Để chỉ xóa khoảng trắng, bạn có thể chỉ định ký tự cần xóa làm đối số strip, nghĩa là:

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

19
Nếu bạn cần chức năng dải, ví dụ như chức năng bản đồ, bạn có thể truy cập nó qua str.strip (), như vậy map (str.strip, Collection_of_s)
Ward

1
Có cách nào để chỉ cắt các khoảng trắng ở cuối không?
Nikhil Girraj

2
@killthrush Cảm ơn bạn đã tham khảo, nhưng tôi nghĩ bạn có nghĩa là rstrip()chức năng. :-)
Nikhil Girraj

14
Đôi khi tôi cảm thấy như trăn cố tình tránh những cái tên được chấp nhận và có ý nghĩa mà đại đa số các ngôn ngữ sử dụng để trở nên "độc nhất" và "khác biệt" - stripthay vì trim, isinstancethay vì instanceof, listthay vì array, v.v. Tại sao không chỉ sử dụng những cái tên ai cũng quen thuộc ?? geez: P
Gershom

3
@GershomMaes trong striptrường hợp của tôi, tôi hoàn toàn đồng ý, nhưng một danh sách hoàn toàn khác với một mảng.
JFA

262

Như đã chỉ ra trong câu trả lời ở trên

myString.strip()

sẽ xóa tất cả các ký tự khoảng trắng ở đầu và cuối như \ n, \ r, \ t, \ f, dấu cách.

Để linh hoạt hơn, hãy sử dụng như sau

  • Chỉ xóa các ký tự khoảng trắng hàng đầu :myString.lstrip()
  • Chỉ xóa các ký tự khoảng trắng theo sau :myString.rstrip()
  • Loại bỏ các ký tự khoảng trắng cụ thể : myString.strip('\n')hoặc myString.lstrip('\n\r')hoặc myString.rstrip('\n\t')như vậy.

Thêm chi tiết có sẵn trong các tài liệu


tôi tin là \ r \ n không \ n \ r ... (không thể chỉnh sửa bài đăng - không đủ số ký tự sửa đổi)
StefanNch

8
@StefanNch: Thứ tự của các nhân vật hoàn toàn không quan trọng. \ n \ r cũng sẽ xóa \ r \ n.
Julian Overmann

122

strip cũng không giới hạn ở các ký tự khoảng trắng:

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

54

Điều này sẽ xóa tất cả khoảng trắng hàng đầu và dấu trong myString:

myString.strip()

3
Bài đăng này chỉ có mã, nó không giải thích chức năng làm gì. Nó loại bỏ khoảng trắng hàng đầu hoặc dấu, hoặc cả hai? Liệu nó chỉ loại bỏ không gian hoặc mọi loại khoảng trắng? Bạn có thể làm cho nó loại bỏ chỉ khoảng trắng sau đó, hoặc có một chức năng khác để làm điều đó? Nếu nó loại bỏ cả khoảng trắng hàng đầu và dấu kiểm, bạn có thể làm cho nó loại bỏ chỉ một trong hai, hoặc là / có (một) chức năng khác để thực hiện công việc không? myString.strip()câu trả lời không ai trong số những câu hỏi tôi đã nêu.
EKons

8
Để công bằng, OP đặc biệt yêu cầu một phương pháp loại bỏ khoảng trắng hàng đầu và dấu kiểm khỏi chuỗi. Câu trả lời đủ tốt cho tôi
Denis Lins

21

Bạn muốn dải ():

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

for phrase in myphrases:
    print phrase.strip()

0

Tôi muốn loại bỏ quá nhiều khoảng trắng trong một chuỗi (cũng ở giữa chuỗi, không chỉ ở đầu hoặc cuối). Tôi đã làm điều này, bởi vì tôi không biết làm thế nào khác:

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)

Điều này thay thế không gian đôi trong một không gian cho đến khi bạn không còn không gian đôi nữa


Mặc dù điều này hoạt động nhưng nó không hiệu quả lắm, thay vào đó hãy sử dụng: stackoverflow.com/a/2077906/1240286
Arklur

0

Tôi không thể tìm thấy giải pháp cho những gì tôi đang tìm kiếm vì vậy tôi đã tạo một số chức năng tùy chỉnh. Bạn có thể thử chúng ra.

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

Nếu bạn muốn cắt bớt số lượng không gian được chỉ định từ trái và phải , bạn có thể làm điều này:

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

Điều này cũng có thể được thực hiện với một biểu thức thông thường

import re

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

0

Làm cách nào để xóa khoảng trắng hàng đầu và dấu kiểm khỏi chuỗi trong Python?

Vì vậy, giải pháp dưới đây sẽ loại bỏ các khoảng trắng hàng đầu và dấu cũng như các khoảng trắng trung gian. Giống như nếu bạn cần để có được một giá trị chuỗi rõ ràng mà không cần nhiều khoảng trắng.

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

Như bạn có thể thấy điều này sẽ loại bỏ tất cả nhiều khoảng trắng trong chuỗi (đầu ra là Hello Worldcho tất cả). Địa điểm không quan trọng. Nhưng nếu bạn thực sự cần khoảng trắng hàng đầu và dấu, thì strip()sẽ được tìm thấy.

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.