Python 如何在不使用strip()函数的情况下删除或去除空白?

Python 如何在不使用strip()函数的情况下删除或去除空白?,python,python-3.x,Python,Python 3.x,编写一个函数,该函数接受由字母组成的输入字符串 字符,并删除字符串的所有前导空格和 返回它而不使用.strip()。例如,如果: 输入字符串=“你好” 然后,您的函数应返回一个字符串,如: 输出字符串=“你好” 下面是我在不使用strip的情况下删除空白的程序: def Leading_White_Space (input_str): length = len(input_str) i = 0 while (length): if(input_str[i]

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

输入字符串=“你好”

然后,您的函数应返回一个字符串,如:

输出字符串=“你好”

下面是我在不使用strip的情况下删除空白的程序:

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)

我选择了remove函数,因为它很容易去掉字符串“Hello”之前的空白。程序还告诉我们,只需在实际字符串之前消除空格。根据我的逻辑,我认为它不仅消除了前导空格,还消除了尾随空格。任何帮助都将不胜感激。

使用
re.sub

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


您可以在字符串的字符上循环,并在到达非空格字符时停止。这里有一个解决方案:

def Leading_White_Space(input_str):
  for i, c in enumerate(input_str):
    if c != ' ':
      return input_str[i:]
编辑: @PM 2Ring提到了一个很好的观点。如果要处理所有类型的空白(例如\t、\n、\r),则需要使用,因此正确的解决方案可能是:

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

为了更彻底,并且不使用其他模块,我们还可以指定要删除的空白(前导、尾随、两者或全部),包括制表符和新行字符。我使用的代码(由于明显的原因,没有其他答案那么紧凑)如下所示,并使用了切片:

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

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

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    '

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

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

可以使用删除字符串开头的所有特殊字符,如下所示

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,它将忽略remove中的所有字符,为了检查这一点,我使用了一个函数(这是一种写短匿名函数的实用形式)

这里有一些测试

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

请尝试
lstrip
……我无法使用功能条()。请阅读问题。试着去掉空格,直到找到一个字母字符。我会试试看。@PaulRooney不太可能:如果它没有死于
属性错误,它会返回
None
。如果您可以就地修改字符串,则不需要返回结果。但是当然,你不会像
result=Leading_White_Space(input_str)
那样称呼它。我也喜欢你的
lstrip()
答案,从技术上讲,它不是
strip()
。老兄,我是python新手,所以我发现理解代码有点困难。请注意,任务是删除所有的前导空格字符,不仅仅是空格字符。在我的答案中的测试字符串上尝试你的代码。在ASCII中,标准的空白字符是
'\t\n\x0b\x0c\r'
(请参阅标准
字符串
模块中的常量)。在Unicode中,有更多的空格字符,该方法可以识别这些字符,但我想我们可以忽略它们。
>>> 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:]