返回字符串去除空白字符后的函数

4

在Python中是否有类似于.strip()/.lstrip()/.rstrip()的现有函数,但是返回剥离掉的空格而不是剥离后的字符串?

即:

test_str = '\n\ttext goes here'
test_str.lstrip() # yields 'text goes here'
test_str.lwhite() # yields '\n\t'

我希望存在 .white(), .lwhite(), 和 .rwhite() 等函数,与此相关的是it技术。否则我只能使用正则表达式和捕获组来解决问题:

^(\s*).*(\s*)$    for .white()
^(\s*)            for .lwhite()
(\s*)$            for .rwhite()

为了更好地举例,Python有.strip()方法,可以删除给定字符串开头和结尾的空格,并返回已剥离的字符串。Python的.lstrip().rstrip()方法也是同样的道理,只是分别用于开头和结尾。
我正在寻找一种方法来返回被剥离掉的字符串末尾的空格。因此,对于以下这样的字符串...
sample = '\n\t this string\t is \n \ta sample\t!\n'

我希望返回一个以'\n\t '开头的版本,返回一个以'\n'结尾的版本,或者在完整版本中返回包含两者的列表。

谢谢大家!


1
你认为使用itertools可以吗?o.0 还是说这是异端邪说? - Shashank
@Shashank:即使他说不,dropwhile和takewhile也很简单,你自己可以编写它们。 :) - abarnert
@Shashank 最初的目标是在尽可能少地导入模块的情况下完成此操作,但在那个时候,我想除非已经有一个可以完成此操作的函数,否则这将带来更多麻烦。不过,你提到了itertools让我很感兴趣。使用该模块如何完成此操作? - lostguru
我认为最有效的方法是将itertools.takewhilereversed结合使用。 - Shashank
2个回答

3

抱歉,我刚意识到你是想使用strip而不是split,这里提供一个itertools.takewhile的解决方案:

from itertools import takewhile

def lstripped(s):
    return ''.join(takewhile(str.isspace, s))

def rstripped(s):
    return ''.join(reversed(tuple(takewhile(str.isspace, reversed(s)))))

def stripped(s):
    return lstripped(s), rstripped(s)

itertools.takewhile的填充程序如下:

def takewhile(predicate, iterable):
    # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
    for x in iterable:
        if predicate(x):
            yield x
        else:
            break

这真的非常巧妙!我一定会记在脑后,因为我现在不确定我会使用哪个。就性能而言,您认为与正则表达式解决方案相比,这将如何表现? - lostguru
@lostguru 从时间复杂度的角度来看,这是尽可能高效的,因为takewhile和reversed都是快速迭代器,可以尽快停止而不必处理整个字符串。因此,它基本上具有与非贪婪的re.search解决方案相同的时间复杂度,一旦找到匹配项就会立即停止。但是时间复杂度并不等同于性能... re是一个专门针对字符串进行优化的模块,而itertools必须能够处理各种可迭代对象。您可能会从re中看到更好的性能,但最好进行基准测试以确保。 - Shashank
明白了,这个知道了真是太好了。明天在工作电脑上试一下。非常感谢! - lostguru

1
我可能过于字面理解你的话 - 但如果你想要获取字符串中的空白字符,那么列表推导式不就是正确的方法了吗?
In [112]: x
Out[112]: '\n\ttext goes here'

In [113]: ''.join([i for i in x if not i.isalnum()]).replace(" ",'')
Out[113]: '\n\t'

关闭哈哈,目标只是返回 '\n\t' 而不是 '\n\t ' - lostguru
更新完毕。看起来它能胜任这项工作。 :) - fixxxer
我举的例子不好,抱歉。Python有.strip()方法,可以删除给定字符串开头和结尾的空格,并返回已剥离的字符串。Python的.lstrip().rstrip()方法也是同样的道理,只是分别用于开头和结尾。我正在寻找一种方法来返回从字符串两端剥离的空格。因此,对于像sample = '\n\t this string\t is \n \ta sample\t!\n'这样的字符串,我想要返回'\n\t '作为开始版本,返回'\n'作为结束版本,或者在完整版本中返回一个包含两者的列表。 - lostguru
啊哈。你也应该把这个放在问题里。 - fixxxer
我原以为提到.strip()就足够了,但现在有了更好的例子,我会把它加到问题中。 - lostguru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接