这与拆分和标点符号无关,您只关心字母(和数字),想要一个正则表达式:
import re
def getWords(text):
return re.compile('\w+').findall(text)
演示:
>>> re.compile('\w+').findall('Hello world, my name is...James the 2nd!')
['Hello', 'world', 'my', 'name', 'is', 'James', 'the', '2nd']
如果你不关心数字,可以将
\w
替换为只包含字母的
[A-Za-z]
,或者包括缩写词在内的
[A-Za-z']
。可能有更高级的方法来包括带重音符号的字母-非数字字符类等其他正则表达式。
这个问题的答案我差点在这里回答:
Split Strings with Multiple Delimiters?。但是你的问题实际上没有具体说明:你希望
'this is: an example'
被分成哪些部分:
['this', 'is', 'an', 'example']
还是
['this', 'is', 'an', '', 'example']
?我假设这是第一种情况。
引用一个提问者的话:“[this', 'is', 'an', example']是我想要的结果。是否存在一种不需要导入正则表达式的方法?如果我们只需将非ascii_letters替换为'',那么将字符串拆分为单词列表,这种方式可行吗?” 最优雅的方法是使用正则表达式,但是可以按以下方式进行处理:
def getWords(text):
"""
Returns a list of words, where a word is defined as a
maximally connected substring of uppercase or lowercase
alphabetic letters, as defined by "a".isalpha()
>>> get_words('Hello world, my name is... Élise!') # works in python3
['Hello', 'world', 'my', 'name', 'is', 'Élise']
"""
return ''.join((c if c.isalnum() else ' ') for c in text).split()
或者.isalpha()
顺便提一下:你也可以这样做,但需要导入另一个标准库:
from itertools import *
def getWords(text):
return [
''.join(chars)
for isWord,chars in
groupby(' My name, is test!', lambda c:c.isalnum())
if isWord
]
如果这是作业的话,他们可能在寻找一种命令式的方法,比如一个两状态有限状态机,其中状态为“上一个字符是否是字母”,如果从字母状态切换到非字母状态,则输出一个单词。不要这样做;这不是一个好的编程方式(尽管有时这种抽象是有用的)。
{}
)。 - johnsyweb