如何简化此功能?

时间:2013-04-25 20:58:42

标签: python

有没有办法简化这个功能?具体来说,我想用更少的缩进行重写它。

# split string (first argument) at location of separators (second argument, should be a string)
def split_string(text, separators):
    text = ' ' + text + ' '
    words = []
    word = ""
    for char in text:
        if char not in separators:
            word += char
        else:
            if word:
                words.append(word)
            word = ""
    if not words:
        words.append(text)
    return words

4 个答案:

答案 0 :(得分:6)

尝试使用re.split,例如:

re.split('[%s]' % (separators),string)

[]创建一个要拆分的正则表达式字符类。

答案 1 :(得分:4)

您的代码似乎生成了

>>> split_string("foo.,.bar", ".,")
[' foo']

但你的评论说

split_string("foo.,.bar", ".,") will return ["foo", "bar"]

假设评论是预期的,那么我会使用itertools.groupby(我讨厌使用正则表达式):

from itertools import groupby

def splitter(text, separators):
    grouped = groupby(text, lambda c: c in separators)
    return [''.join(g) for k,g in grouped if not k]

给出了

>>> splitter("foo.,.bar", ".,")
['foo', 'bar']

groupby返回一个迭代器,该迭代器通过按某些函数分组的连续项返回 - 在本例中为lambda c: c in separators - 这些术语。

答案 2 :(得分:1)

您应该使用split()方法。摘自官方文件:

  

str.split([sep [,maxsplit]])

     

使用sep作为分隔符字符串,返回字符串中的单词列表。   如果给出maxsplit,则最多完成maxsplit拆分(因此,列表将具有   最多maxsplit + 1个元素)。如果未指定maxsplit或-1,则表示没有   限制分割数量(所有可能的分割)。

     

如果给出sep,则连续分隔符不会组合在一起并被视为   分隔空字符串(例如,'1,,2'.split(',')返回['1','','2'])。   sep参数可能包含多个字符(例如,   '1<> 2<">><">>返回['1','2','3']。用一个分裂一个空字符串   指定的分隔符返回['']。

     

如果未指定sep或为None,则应用不同的拆分算法:   连续空格的运行被视为单个分隔符,结果   如果字符串有前导或结尾,则在开头或结尾不包含空字符串   尾随空格。因此,拆分空字符串或包含的字符串   只有具有无分隔符的空格返回[]。

     

例如,'1 2 3'.split()返回['1','2','3']和   '1 2 3'.split(无,1)返回['1','2 3']。

答案 3 :(得分:1)

你可以这样做:

myString = "Some-text-here"
splitWords = myString.split("-")

上面的代码将返回一个List,其中包含单词。我用“ - ”作为分隔符,你可以指定你喜欢的任何分隔符。默认是“空格”分隔符,如下所示:

myString = "Some text here"
splitWords = myString.split()