6

问题:通过作为列表传入的分隔符将字符串拆分为单词列表。

细绳:"After the flood ... all the colors came out."

期望的输出: ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

我已经编写了以下函数 - 请注意,我知道有更好的方法可以使用一些内置函数的 python 来拆分字符串,但为了学习,我认为我会这样做:

def split_string(source,splitlist):
    result = []
    for e in source:
           if e in splitlist:
                end = source.find(e)
                result.append(source[0:end])
                tmp = source[end+1:]
                for f in tmp:
                    if f not in splitlist:
                        start = tmp.find(f)
                        break
                source = tmp[start:]
    return result

out = split_string("After  the flood   ...  all the colors came out.", " .")

print out

['After', 'the', 'flood', 'all', 'the', 'colors', 'came out', '', '', '', '', '', '', '', '', '']

我不明白为什么“出来”没有分成“来”和“出来”两个单独的词。好像两个单词之间的空白字符被忽略了。我认为输出的其余部分是垃圾,源于与“出来”问题相关的问题。

编辑:

我按照@Ivc 的建议提出了以下代码:

def split_string(source,splitlist):
    result = []
    lasti = -1
    for i, e in enumerate(source):
        if e in splitlist:
            tmp = source[lasti+1:i]
            if tmp not in splitlist:
                result.append(tmp)
            lasti = i
        if e not in splitlist and i == len(source) - 1:
            tmp = source[lasti+1:i+1]
            result.append(tmp)
    return result

out = split_string("This is a test-of the,string separation-code!"," ,!-")
print out
#>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code']

out = split_string("After  the flood   ...  all the colors came out.", " .")
print out
#>>> ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",")
print out
#>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']

out = split_string(" After  the flood   ...  all the colors came out...............", " ."
print out
#>>>['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
4

6 回答 6

3

您不需要内部循环调用。就这样就足够了:

def split_string(source,splitlist):
    result = []
    for e in source:
           if e in splitlist:
                end = source.find(e)
                result.append(source[0:end])
                source = source[end+1:]
    return result

您可以通过在将 source[:end] 附加到列表之前检查它是否为空字符串来消除“垃圾”(即空字符串)。

于 2012-05-30T02:49:38.890 回答
2

你似乎在期待:

source = tmp[start:]

修改source外部 for 循环正在迭代的那个。它不会 - 该循环将继续遍历您给它的字符串,而不是现在使用该名称的任何对象。这可能意味着您要处理的角色可能不在source.

不要尝试这样做,而是以这种方式跟踪字符串中的当前索引:

for i, e in enumerate(source):
   ...

并且您要附加的内容将始终是source[lasti+1:i],您只需要跟踪lasti.

于 2012-05-30T02:59:40.060 回答
2

我认为如果你使用正则表达式,如果你只想要上面给出的字符串中的单词,你可以很容易地得到它。

>>> import re
>>> string="After the flood ... all the colors came out."
>>> re.findall('\w+',string)
['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
于 2012-06-01T11:53:40.230 回答
0

为什么要做太多的事情,就这么简单,试试..
str.split(strSplitter , intMaxSplitCount) intMaxSplitCount 是可选
的在你的情况下,你也必须做一些 Houskeeping,如果你想避免......一个是你可以替换它,比如str.replace(".","", 3) 3 是可选的,它会仅替换前 3 个点

所以简而言之,你必须遵循,
print ((str.replace(".", "",3)).split(" ")) 它会打印你想要的

我执行了, Just Check Here,...

于 2012-05-30T03:29:10.987 回答
0
[x for x in a.replace('.', '').split(' ') if len(x)>0]

这里 'a' 是您的输入字符串。

于 2012-05-30T03:45:06.293 回答
0

更简单的方法,至少看起来更简单..

import string

    def split_string(source, splitlist):
        table = string.maketrans(splitlist,  ' ' * len(splitlist))
        return string.translate(source, table).split()

您可以签出 string.maketransstring.translate

于 2012-05-30T04:49:39.740 回答