我正在尝试将字符串分成单词,删除空格和标点符号。
我尝试使用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()
来执行此操作。请不要给我一个正则表达式的解决方案。
答案 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?']
也许这可以帮助某人。