【问题标题】:How to remove the trailing white spaces in python?如何删除python中的尾随空格?
【发布时间】:2016-02-26 10:55:46
【问题描述】:

编写一个函数,接受由字母组成的输入字符串 字符并删除字符串的所有尾随空格和 返回它而不使用任何 .strip() 方法。例如:

input_string = "你好"

那么你的函数应该返回一个输出字符串,例如: output_string = "你好"

这是我的代码:

def Trailing_White_Space (input_str):

    count = 0
    for i in range (len(input_str) + 1, 0):
        if (input_str[i] != ' '):
            count = i
            break
    new_s = input_str[len(input_str):count]
    return (new_s)

#Main Program
input_str = "    Hello    "
result = Trailing_White_Space (input_str)
print (result)

我确信逻辑是正确的。我已经用可能的测试用例试运行了代码。我的代码仍然没有给出任何输出。请帮忙。

【问题讨论】:

  • 顺便说一句,您应该接受您之前(相关)question 的答案之一。
  • 您的任务是删除 所有 尾随空格,而不仅仅是 ' ' 空格字符。您还需要删除其他空白字符,如 '\n''\r''\t' 等。处理该问题的干净方法是使用 .isspace 方法,就像我在其他问题上建议的那样。
  • 你试过re.sub( )吗?
  • 伙计,我不知道它是什么。我只是这里的初学者。
  • @Prashanth:我不认为 Karan 的老师会喜欢这个作业的基于正则表达式的答案。

标签: python python-3.x


【解决方案1】:

这是您遇到问题的主要原因:

input_str[len(input_str):count]

如果切片开始len(input_str),那么你根本不会从中得到任何字符。你只需要使用[:count],除了你也没有正确获得count

为了从末尾循环,您必须使用 range 的第三个参数来减少您的值,所以它必须是

for i in range(len(input_str) - 1, -1, -1):

您想要 -1,它每次将值减一。你还想从len-1 开始,否则你会得到无效的索引,如果你想以 0 结束,你需要传递 -1,因为范围不会到达结束值。

现在您可以正确使用count 和切片input_str

return input_str[:count]

【讨论】:

  • 很棒的分析。非常感谢。
  • 我们为什么要使用 len-1?当我运行程序时,我得到的输出是“地狱”,这是不正确的。
【解决方案2】:

如果您想查看单行答案。就是这样:

from string import whitespace as ws
def remove_trailing_whitespace(t):
    return t[:-next(i for i, c in enumerate(t[::-1]) if c not in ws)]

例子:

>>> print '"{}"'.format(remove_trailing_whitespace('  hello  '))  # spaces
"  hello"
>>> print '"{}"'.format(remove_trailing_whitespace('  hello\n'))  # newline
"  hello"
>>> print '"{}"'.format(remove_trailing_whitespace('  hello\t'))  # tab
"  hello"
>>> print '"{}"'.format(remove_trailing_whitespace('  hello \t\n '))  # space, newline, tab
"  hello"

奖励:所有空白字符,不仅仅是空格,而且效率最高。

【讨论】:

  • 这是最好的答案。有效解决OP的问题。在我的答案中添加了指向您的答案的链接。 +1
【解决方案3】:

更正您分配new_s 变量的行。

new_s = input_str[:count+1]

此外,由于您的循环需要在每次迭代后递减。将0 替换为-1

for i in range(len(input_str)-1, -1, -1):

编辑:请参考 @InbarRose's answer 以获得更好的选择。

【讨论】:

  • 这给了我“地狱”的输出
  • 我希望输出为 'Hello'
  • @KaranThakkar - 让它成为new_s = input_str[:count+1]
【解决方案4】:

尝试使用re.sub()

import re

def remove(my_string):
    new_string = re.sub(r'(.*?\w)([ \t\n\r]*)', r'\1', my_string)
    return(new_string)

my_string = str(input())
modified = remove(my_string)
print(modified)

说明:

re是python中用于正则表达式的模块。

re.sub(pattern, replacing_pattern, string_to_be_modified) 是语法。

这里,方括号中的任何字符(\w -> 任何字符,-> 空格,\t -> 制表符,\n -> 换行符,\r -> 回车)当遇到的被''(Nothing) 替换。因此你得到一个剥离的字符串。

查找所有正则表达式匹配here

【讨论】:

  • \s 用于一般的空白匹配,而不仅仅是空格字符。详情见re docs;另请注意,由于 Unicode 问题,Python 3 与 Python 2 中的行为略有不同。
  • @PM2Ring 感谢您指出这一点。我已经修改了答案。
【解决方案5】:

使用while循环:

my_str = ' hello   '
while len(my_str) > 0 and my_str[-1] == ' ':
    my_str = my_str[:-1]

print(my_str) # prints: ' hello'

【讨论】:

  • 这不会剥离'\t''\r'
【解决方案6】:

range() 默认上升。如果您希望它反向运行,则必须明确设置步骤。另外,你不想从len(input_str)开始+ 1.你想从len(input_str)开始- 1.对于任何可迭代,x,x[len(x)]没有定义。 x[len(x) + 1] 离得更远了。要获取最后一个元素,您应该使用len(input_str) - 1。此外,如果将第二个数字设置为 0,则不会评估第一个元素。 range() 的第二个参数是排他性的,所以你应该比你认为应该多走一个数字:

def Trailing...
    count = 0
    for i in range(len(input_str) - 1, -1, -1):
    ...

【讨论】:

    【解决方案7】:

    您的循环没有通过。您必须指定它正在递减。下面是工作代码。

    def Trailing_White_Space (input_str):
    
        count = 0
        for i in range (len(input_str)-1, 0, -1):
            if (input_str[i] != ' '):
                count = i
                break
        slice_index= (len(input_str)-count)-1
        new_s = input_str[0:-1*slice_index]
        return (new_s)
    
    #Main Program
    input_str = "    Hello    "
    result = Trailing_White_Space (input_str)
    print (result)
    

    【讨论】:

    • OP 说“不使用 .strip()”
    猜你喜欢
    • 2013-08-13
    • 2013-06-25
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多