如何修剪字符串中的空格?


1155

如何从Python中的字符串中删除开头和结尾的空格?

例如:

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

17
这个问题只是让我与下班同事谈论剥离3分钟的问题。对于半途而入的其他人,他们会以为我们都是夜间工作。
怀特卡特猫

Answers:


1734

只是一个空格,还是所有连续的空格?如果是第二个,则字符串已经具有.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()来访问它,就像map(str.strip,collection_of_s)
Ward

1
有没有办法只修剪两端的空格?
Nikhil Girraj 2015年

2
@killthrush感谢您的参考,但我认为您的意思是该rstrip()功能。:-)
Nikhil Girraj 2015年

14
有时候我觉得自己像蟒蛇特意避免了被广泛接受和有意义的名字,绝大多数的语言,以便使用是“独特的”和“不同” - strip而不是trimisinstance不是instanceoflist不是array,等,等,为什么不直接使用每个人都熟悉的名字?geez:P
Gershom

3
strip我完全同意@GershomMaes的观点,但是列表与数组完全不同。
JFA

262

正如以上答案中指出的

myString.strip()

将删除所有前导和尾随空格字符,例如\ n,\ r,\ t,\ f,空格。

为了获得更大的灵活性,请使用以下命令

  • 仅删除前导空格字符:myString.lstrip()
  • 仅删除尾随空白字符:myString.rstrip()
  • 删除特定的空格字符:myString.strip('\n')myString.lstrip('\n\r')or myString.rstrip('\n\t')等等。

更多详细信息可在文档中找到


我相信是\ r \ n不是\ n \ r ...(无法编辑帖子-修改的字符不足)
StefanNch 2014年

8
@StefanNch:字符的顺序根本没有关系。\ n \ r也会删除\ r \ n。
Johannes Overmann


54

这将删除以下所有开头和结尾的空格myString

myString.strip()

3
这篇文章只有代码,没有解释该功能的作用。它会删除前导空格还是尾随空格,或者同时删除两者?它会删除空格还是所有空白?可以让它删除空格吗,还是有另一个功能可以删除?如果它同时删除了前导空格和尾随空格,是否可以使其仅删除这两个空格之一,或者是否还有其他功能可以完成此工作?myString.strip()我没有回答任何问题。
EKons,2016年

8
公平地说,OP特别要求一种从字符串中删除开头和结尾空格的方法。对我的足够好的答案
Denis Lins

21

您要strip():

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

如果要从left和right修剪指定数量的空格,可以执行以下操作:

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()就会发现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.