使用split()在不同的标点符号上划分字符串

时间:2012-03-21 01:16:38

标签: python string split

我正在尝试将字符串分成单词,删除空格和标点符号。

我尝试使用split()方法,一次传递所有标点符号,但结果不正确:

>>> test='hello,how are you?I am fine,thank you. And you?'
>>> test.split(' ,.?')
['hello,how are you?I am fine,thank you. And you?']

我实际上已经知道如何使用正则表达式执行此操作,但我想知道如何使用split()来执行此操作。请不要给我一个正则表达式的解决方案。

7 个答案:

答案 0 :(得分:13)

如果你想基于多个分隔符拆分一个字符串,就像在你的例子中一样,你需要使用re模块,尽管你有异常的反对意见,如下所示:

>>> re.split('[?.,]', test)
['hello', 'how are you', 'I am fine', 'thank you', ' And you', '']

可能使用split获得类似的结果,但您需要为每个字符调用一次split,并且需要迭代前一次拆分的结果。这有效,但它是u-g-l-y:

>>> sum([z.split() 
... for z in sum([y.split('?') 
... for y in sum([x.split('.') 
... for x in test.split(',')],[])], [])], [])
['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you']

这使用sum()来展平上一次迭代返回的列表。

答案 1 :(得分:12)

这是我在不使用re模块的情况下可以想到的最佳方式:

"".join((char if char.isalpha() else " ") for char in test).split()

答案 2 :(得分:6)

由于您不想使用re模块,您可以使用:

 test.replace(',',' ').replace('.',' ').replace('?',' ').split()

答案 3 :(得分:4)

larsks答案的修改版本,您无需自己键入所有标点字符:

import re, string

re.split("[" + string.punctuation + "]+", test)
['hello', 'how are you', 'I am fine', 'thank you', ' And you', '']

答案 4 :(得分:3)

您可以编写一个函数来扩展.split()的使用:

def multi_split(s, seprators):
    buf = [s]
    for sep in seprators:
        for loop, text in enumerate(buf):
            buf[loop:loop+1] = [i for i in text.split(sep) if i]
    return buf

试一试:

>>> multi_split('hello,how are you?I am fine,thank you. And you?', ' ,.?') ['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you']

这将更加清晰,可以在其他情况下使用。

答案 5 :(得分:0)

道歉的道歉 - 这个话题是非正则表达式分裂句子的第一个结果。因为我必须为我的学生提出一个非Python特定的方法,并且这个帖子没有回答我的问题,我想我会分享以防万一。

代码的要点是不使用库(并且它可以快速处理大文件):

sentence = "George Bernard-Shaw was a fine chap, I'm sure - who can really say?"
alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
words = []
word = ""
mode = 0
for ch in sentence:
    if mode == 1:
        words.append(word)
        word = ""
        mode = 0
    if ch in alpha or ch == "'" or ch == "-":
        word += ch
    else:
        mode = 1
words.append(word)
print(words)

输出:

['George', 'Bernard-Shaw', 'was', 'a', 'fine', 'chap', "I'm", 'sure', '-', 'who', 'can', 'really', 'say']

我确实在大约半小时内写了这个,所以我确定逻辑可以清理干净。我也承认它可能需要额外的逻辑来正确处理诸如连字符之类的警告,因为与倒置逗号相比,它们的使用是不一致的。确实有任何模块可以正确地做到这一点吗?

答案 6 :(得分:-1)

保留标点符号或其他分隔符的一种简单方法是:

import re

test='hello,how are you?I am fine,thank you. And you?'

re.findall('[^.?,]+.?', test)

结果:

['hello,', 'how are you?', 'I am fine,', 'thank you.', ' And you?']

也许这可以帮助某人。