Python:从字符串的多行中删除空格

时间:2013-09-20 11:39:11

标签: python list whitespace sequence output

所以我需要程序的输出看起来像:

ababa
ab ba 
 xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces .
 no dot at the end
The largest run of consecutive whitespace characters was 47.

但我得到的是:

ababa

ab ba

xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces .
no dot at the end
The longest run of consecutive whitespace characters was 47.

当我进一步研究我写的代码时,我发现print(c)语句发生了这种情况:

['ababa', '', 'ab           ba ', '', '                                      xxxxxxxxxxxxxxxxxxx', 'that is it followed by a lot of spaces                         .', '                                               no dot at the end']

在某些行之间,, '',,这可能是我的打印声明无法工作的原因。

我该如何删除它们?我尝试使用不同的列表函数,但我不断收到语法错误。

这是我制作的代码:

  a = '''ababa

    ab           ba 

                                      xxxxxxxxxxxxxxxxxxx
that is it followed by a lot of spaces                         .
                                               no dot at the end'''


c = a.splitlines()
print(c)

#d = c.remove(" ") #this part doesnt work
#print(d)

for row in c:
    print(' '.join(row.split()))

last_char = ""
current_seq_len = 0
max_seq_len = 0

for d in a:
    if d == last_char:
        current_seq_len += 1
        if current_seq_len > max_seq_len:
            max_seq_len = current_seq_len
    else:
        current_seq_len = 1
        last_char = d
    #this part just needs to count the whitespace

print("The longest run of consecutive whitespace characters was",str(max_seq_len)+".")

3 个答案:

答案 0 :(得分:2)

据我所知,您最简单的解决方案是使用list comprehension

c= [item for item in a.splitlines() if item != '']

如果您希望通过删除仅包含空格的字符串(例如' ')来使其更加健壮,那么您可以按如下方式更改它:

c= [item for item in a.splitlines() if item.strip() != '']

然后您可以将列表重新加入,如下所示:

output = '\n'.join(c)

答案 1 :(得分:1)

使用内置的filter函数可以轻松解决这个问题:

c = filter(None, a.splitlines())
# or, more explicit
c = filter(lambda x: x != "", a.splitlines())

第一个变体将创建一个列表,其中包含a.splitlines()返回的列表中未评估为False的列表中的所有元素,如空字符串。 第二个变体创建一个小的匿名函数(使用lambda),它检查给定元素是否为空字符串,如果是这种情况则返回False。这比第一个变体更明确。

另一种选择是使用list comprehension来实现同样的目标:

c = [string for string in a.splitlines if string]
# or, more explicit
c = [string for string in a.splitlines if string != ""]

答案 2 :(得分:1)

正则表达式时间:

import re

print(re.sub(r"([\n ])\1*", r"\1", a))
#>>> ababa
#>>>  ab ba 
#>>>  xxxxxxxxxxxxxxxxxxx
#>>> that is it followed by a lot of spaces .
#>>>  no dot at the end

re.sub(matcher, replacement, target_string)

匹配器是r"([\n ])\1*,意思是:

([\n ]) → match either "\n" or " " and put it in a group (#1)
\1*     → match whatever group #1 matched, 0 or more times

替换只是

\1 → group #1

您可以使用

获取最长的空白序列
max(len(match.group()) for match in re.finditer(r"([\n ])\1*", a))

使用相同的匹配器,但只是得到它们的长度,然后max它。