【问题标题】:How to remove or strip off white spaces without using strip() function?如何在不使用 strip() 函数的情况下删除或去除空格?
【发布时间】:2016-02-22 10:55:42
【问题描述】:

编写一个函数,接受由字母组成的输入字符串 字符并删除字符串的所有前导空格和 在不使用 .strip() 的情况下返回它。例如,如果:

input_string = "你好"

那么你的函数应该返回一个字符串,例如:

output_string = "你好"

以下是我在不使用条带的情况下删除空格的程序:

def Leading_White_Space (input_str):
    length = len(input_str)
    i = 0
    while (length):
        if(input_str[i] == " "):
            input_str.remove()
        i =+ 1
        length -= 1


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

我选择了删除函数,因为它可以很容易地删除字符串“Hello”之前的空格。该程序还告诉仅消除实际字符串之前的空格。按照我的逻辑,我认为它不仅消除了前导空格,而且还消除了尾随空格。任何帮助将不胜感激。

【问题讨论】:

  • 试试lstrip .........
  • 我不能使用函数 strip()。请阅读问题。
  • 尝试删除空格直到达到字母字符
  • 好一个。我会试试的。
  • @PaulRooney 不完全是:它会返回 None,如果它没有以 AttributeError 结束。如果您可以就地修改字符串,则不需要返回结果。但当然,你不会像result = Leading_White_Space(input_str) 那样称呼它。

标签: python python-3.x


【解决方案1】:

您可以遍历字符串的字符并在到达非空格字符时停止。这是一种解决方案:

def Leading_White_Space(input_str):
  for i, c in enumerate(input_str):
    if c != ' ':
      return input_str[i:]

编辑: @PM 2Ring 提到了一个好点。如果您想处理所有类型的空格(例如 \t、\n、\r),则需要使用isspace(),因此正确的解决方案可能是:

def Leading_White_Space(input_str):
  for i, c in enumerate(input_str):
    if not c.isspace():
      return input_str[i:]

【讨论】:

  • 在我的答案中的测试字符串上尝试您的代码。在 ASCII 中,标准空白字符是 '\t\n\x0b\x0c\r '(参见标准 string 模块中的 string.whitespace 常量)。在 Unicode 中,有更多的空白字符,.isspace 方法可以识别它们,但我想我们可以在这个分配中忽略它们。
【解决方案2】:

这是另一种去除前导空格的方法,它实际上去除了 all 前导空格,而不仅仅是' ' 空格字符。无需费心跟踪字符串中字符的索引,我们只需要一个标志来让我们知道何时停止检查空格。

def my_lstrip(input_str):
    leading = True
    for ch in input_str:
        if leading:
            # All the chars read so far have been whitespace
            if not ch.isspace():
                # The leading whitespace is finished
                leading = False
                # Start saving chars
                result = ch
        else:
            # We're past the whitespace, copy everything
            result += ch
    return result

# test
input_str = " \n \t Hello    "
result = my_lstrip(input_str)
print(repr(result))

输出

'Hello    '

还有很多其他方法可以做到这一点。当然,在实际程序中,您只需使用字符串 .lstrip 方法,但这里有一些使用迭代器的可爱方法:

def my_lstrip(input_str):
    it = iter(input_str)
    for ch in it:
        if not ch.isspace():
            break
    return ch + ''.join(it)

def my_lstrip(input_str):
    it = iter(input_str)
    ch = next(it)
    while ch.isspace():
        ch = next(it)
    return ch + ''.join(it)

【讨论】:

    【解决方案3】:

    使用re.sub

    >>> input_string = " Hello "
    >>> re.sub(r'^\s+', '', input_string)
    'Hello '
    

    >>> def remove_space(s):
        ind = 0
        for i,j in enumerate(s):
            if j != ' ':
                ind = i
                break
        return s[ind:]
    
    >>> remove_space(input_string)
    'Hello '
    >>> 
    

    【讨论】:

    • 我也喜欢你的lstrip() 答案,技术上不是strip()
    • 伙计,我是 python 新手,所以我发现代码有点难以理解。
    • 请注意,分配是删除所有前导空白字符,而不仅仅是空格字符。
    【解决方案4】:

    为了彻底并且不使用其他模块,我们还可以指定要删除的空格(前导、尾随、两者或全部),包括制表符和换行符。我使用的代码(由于显而易见的原因,比其他答案更简洁)如下,并使用了切片:

    def no_ws(string,which='left'):
        """
        Which takes the value of 'left'/'right'/'both'/'all' to remove relevant 
        whitespace.
        """
        remove_chars = (' ','\n','\t')
        first_char = 0; last_char = 0
    
        if which in ['left','both']:
            for idx,letter in enumerate(string):
                if not first_char and letter not in remove_chars:
                    first_char = idx
                    break
            if which == 'left':
                return string[first_char:]
    
        if which in ['right','both']:
            for idx,letter in enumerate(string[::-1]):
                if not last_char and letter not in remove_chars:
                    last_char = -(idx + 1)
                    break
            return string[first_char:last_char+1]
    
        if which == 'all':
            return ''.join([s for s in string if s not in remove_chars])
    

    【讨论】:

      【解决方案5】:

      您可以使用itertools.dropwhile 像这样从字符串开头删除所有特殊字符

      import itertools
      
      def my_lstrip(input_str,remove=" \n\t"):
          return "".join( itertools.dropwhile(lambda x:x in remove,input_str))
      

      为了使其更灵活,我添加了一个名为 remove 的附加参数,它们表示要从字符串中删除的字符,默认值为 " \n\t",然后使用 dropwhile 它将忽略删除中的所有字符,以检查这个我使用lambda 函数(这是编写简短匿名函数的一种实用形式)

      这里有几个测试

      >>> my_lstrip(" \n \t Hello    ")
      'Hello    '
      >>> my_lstrip("   Hello    ")
      'Hello    '
      >>> my_lstrip(" \n \t Hello    ")
      'Hello    '
      >>> my_lstrip("---   Hello    ","-")
      '   Hello    '
      >>> my_lstrip("---   Hello    ","- ")
      'Hello    '
      >>> my_lstrip("- - - Hello    ","- ")
      'Hello    '
      >>> 
      

      前面的函数等价于

      def my_lstrip(input_str,remove=" \n\t"):
          i=0
          for i,x in enumerate(input_str):
              if x not in remove:
                  break
          return input_str[i:]
      

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        相关资源
        最近更新 更多