有没有办法简化这个功能?具体来说,我想用更少的缩进行重写它。
# 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
答案 0 :(得分:6)
答案 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()