删除字符串中的空格而不分割功能

时间:2015-11-26 18:34:14

标签: python split

需要删除字符串中所有多余的空格,包括开头和结尾处的空格。我不能使用拆分功能。只有if和while语句。到目前为止我有这个,但每次运行它时,它只会以完全相同的方式返回输入。

def cleanstring(S):
  i=0
  startpos=0
  endpos=0
  end=-1
  word=0


  #find position of first letter
  while S[i]==(" "):
    i=i+0
    startpos=i

  #find last letter
  while (S[end]==(" ")):
     end=end-1
     endpos=S[len(S)-end]

  #make first letter found the first letter in the string
  if S[i]!=(" "):
    word=S[i]

  #start between startpos and endpos to find word
  while (i<endpos) and (i>startpos):
    while S[i]!=(" "):
      word=word+S[i]
    if S[i]==(" "):
      if (S[i+1]==("")) or (S[i-1]==(" ")):
        word=word+(" ")
      else:
        word=word+(" ")
  #return the word
 print(word)

Input=["   Hello to   the world    "]  

6 个答案:

答案 0 :(得分:1)

Concat转到临时字符串,如果你点击一个空格字符检查临时字符串是否为空,如果没有产生它并重置临时字符串。

s = "    Hello to   the world    "
def split(s):
    temp_s = ""
    for ch in s:
        if ch.isspace():
            if temp_s:
               yield temp_s
               temp_s = ""
        else:
            temp_s += ch
    if temp_s:
        yield temp_s

输出:

In [5]: s = "    Hello to   the world    "

In [6]: list(split(s))
Out[6]: ['Hello', 'to', 'the', 'world']

In [7]: s = "    Hello\tto\r\nthe world    "

In [8]: list(split(s))
Out[8]: ['Hello', 'to', 'the', 'world']

In [10]: list(split(s))
Out[10]: ['Hello', 'world']

In [11]: s = "Hello"

In [12]: list(split(s))
Out[12]: ['Hello']

显然,如果需要,你可以将for改为while循环。

答案 1 :(得分:0)

如果使用带有空格的字符串调用cleanstring函数,则会导致无限循环:

while S[i]==(" "):
    i=i+0
    startpos=i

由于你向i添加零,它永远不会改变。你应该将它增加1,这可以这样做:

i += 1

这是

的简写
i = i + 1

但是,Input甚至不是字符串,而是包含字符串的列表。您应该将输入表达式更改为此

Input = "   Hello to   the world    "

你所拥有的方括号使它成为一个包含字符串的列表。

答案 2 :(得分:0)

使用for

def cleanstring(str_in):
    str_out = ''
    last_char = None
    for cur_char in str_in:
        str_out += '' if last_char == ' ' and cur_char ==' ' else cur_char
        last_char = cur_char
    return str_out

使用while

def cleanstring(str_in):
    str_out = ''
    last_char = None
    index = 0
    while str_in[index:index+1]:
        cur_char = str_in[index:index+1]
        str_out += '' if last_char == ' ' and cur_char ==' ' else cur_char
        last_char = cur_char
        index+=1
    return str_out

如果最后一个字符和当前是空格,则不要附加空格。

我们假设空间是唯一关注的空白。否则,这是一组空格的解决方案:

def cleanstring(str_in):
    str_out = ''
    last_char = None
    index = 0
    whitespace = [' ','\t','\n','\r','\f','\v']
    while str_in[index:index+1]:
        a = str_in[index:index+1]
        str_out += '' if last_char in whitespace and a in whitespace else a
        last_char = a
        index+=1
    return str_out

除了第一个检测到的条目外,它会删除所有空格,但是如果我们要删除与相邻空格类似的空格并留下第一个检测到的实例:

def cleanstring(str_in):
    str_out = ''
    last_char = None
    index = 0
    whitespace = [' ','\t','\n','\r','\f','\v']
    while str_in[index:index+1]:
        a = str_in[index:index+1]
        str_out += '' if last_char == a and a in whitespace else a
        last_char = a
        index+=1
    return str_out

如果您担心使用in,可以将其替换为(使用cleanstring的最后一个实例作为示例):

def cleanstring(str_in):
    def is_whitespace_in(char):
        whitespace = [' ','\t','\n','\r','\f','\v']
        local_index = 0
        while whitespace[local_index:local_index+1]:
            a = whitespace[local_index:local_index+1][0]
            if a[0] == char:
                return True
            local_index+=1
        return False

    str_out = ''
    last_char = None
    index = 0
    while str_in[index:index+1]:
        a = str_in[index:index+1]
        str_out += '' if last_char == a and is_whitespace_in(a) else a
        last_char = a
        index+=1
    return str_out

最后一个例子的空白来自Cython re's \s definition

\s       Matches any whitespace character; equivalent to [ \t\n\r\f\v] in
         bytes patterns or string patterns with the ASCII flag.
     

第73-74行

我知道这可能不是最符合Pythonic或PEP8的,请随时编辑。

答案 3 :(得分:0)

只需使用string.strip()方法。

答案 4 :(得分:0)

这种功课还是什么? 如果您不能使用&#39;只有&#39;如果&#39;然后&#39;当我使用计数器并检查字符串中的每个字符时。

def clean(input):
    idx = 0
    out = input[idx]
    while idx < len(input):
        if input[idx] != out[-1] or input[idx] != ' ':
            out += input[idx]
        idx+=1
    return out

当然,它不是完整的解决方案,但你明白了。

答案 5 :(得分:-1)

请阅读以下评论。

TABLE = str.maketrans('','',' \n\r\t\f')

def clrstr(inp):
    return inp.translate(TABLE)

但是,如果您正在学习while和for循环,那对它没有多大帮助。