我正在尝试使用python将字符串转换为单词列表。我想采取以下内容:
string = 'This is a string, with words!'
然后转换为这样的东西:
list = ['This', 'is', 'a', 'string', 'with', 'words']
请注意省略标点符号和空格。最快的方法是什么?
答案 0 :(得分:70)
试试这个:
import re
mystr = 'This is a string, with words!'
wordList = re.sub("[^\w]", " ", mystr).split()
工作原理:
来自文档:
re.sub(pattern, repl, string, count=0, flags=0)
返回通过替换repl替换字符串中最左边非重叠模式而获得的字符串。如果未找到模式,则返回字符串不变。 repl可以是字符串或函数。
所以在我们的案例中:
pattern是任何非字母数字字符。
[\ w]表示任何字母数字字符,等于字符集 [A-ZA-Z0-9 _]
a到z,A到Z,0到9和下划线。
所以我们匹配任何非字母数字字符并将其替换为空格。
然后我们split()它按空格分割字符串并将其转换为列表
所以'你好世界'
成为'你好世界'
使用re.sub
然后['你好','世界']
分裂后的
如果有任何疑问,请告诉我。
答案 1 :(得分:64)
我认为这是最容易让其他人在这个帖子上磕磕绊绊的最简单的方法,因为迟到了回应:
>>> string = 'This is a string, with words!'
>>> string.split()
['This', 'is', 'a', 'string,', 'with', 'words!']
答案 2 :(得分:29)
要做到这一点非常复杂。对于您的研究,它被称为单词标记化。如果你想看看别人做了什么,你应该看看NLTK,而不是从头开始:
>>> import nltk
>>> paragraph = u"Hi, this is my first sentence. And this is my second."
>>> sentences = nltk.sent_tokenize(paragraph)
>>> for sentence in sentences:
... nltk.word_tokenize(sentence)
[u'Hi', u',', u'this', u'is', u'my', u'first', u'sentence', u'.']
[u'And', u'this', u'is', u'my', u'second', u'.']
答案 3 :(得分:15)
最简单的方法:
>>> import re
>>> string = 'This is a string, with words!'
>>> re.findall(r'\w+', string)
['This', 'is', 'a', 'string', 'with', 'words']
答案 4 :(得分:11)
使用string.punctuation
表示完整性:
import re
import string
x = re.sub('['+string.punctuation+']', '', s).split()
这也处理新行。
答案 5 :(得分:5)
好吧,你可以用
import re
list = re.sub(r'[.!,;?]', ' ', string).split()
请注意,string
和list
都是内置类型的名称,因此您可能不希望将它们用作变量名称。
答案 6 :(得分:3)
单词的正则表达式可以让您获得最大的控制权。您可能需要仔细考虑如何处理带有破折号或撇号的单词,例如"我' m"。
答案 7 :(得分:2)
就我个人而言,我认为这比提供的答案更清晰
def split_to_words(sentence):
return list(filter(lambda w: len(w) > 0, re.split('\W+', sentence))) #Use sentence.lower(), if needed
答案 8 :(得分:1)
list=mystr.split(" ",mystr.count(" "))
答案 9 :(得分:1)
受到@ mtrw的回答的启发,但改进了只删除字边界的标点符号:
import re
import string
def extract_words(s):
return [re.sub('^[{0}]+|[{0}]+$'.format(string.punctuation), '', w) for w in s.split()]
>>> str = 'This is a string, with words!'
>>> extract_words(str)
['This', 'is', 'a', 'string', 'with', 'words']
>>> str = '''I'm a custom-built sentence with "tricky" words like https://stackoverflow.com/.'''
>>> extract_words(str)
["I'm", 'a', 'custom-built', 'sentence', 'with', 'tricky', 'words', 'like', 'https://stackoverflow.com']
答案 10 :(得分:0)
这是我尝试使用正则表达式的编码挑战,
outputList = "".join((c if c.isalnum() or c=="'" else ' ') for c in inputStr ).split(' ')
撇号的作用似乎很有趣。
答案 11 :(得分:0)
这样你就可以消除字母表之外的所有特殊字符:
def wordsToList(strn):
L = strn.split()
cleanL = []
abc = 'abcdefghijklmnopqrstuvwxyz'
ABC = abc.upper()
letters = abc + ABC
for e in L:
word = ''
for c in e:
if c in letters:
word += c
if word != '':
cleanL.append(word)
return cleanL
s = 'She loves you, yea yea yea! '
L = wordsToList(s)
print(L) # ['She', 'loves', 'you', 'yea', 'yea', 'yea']
我不确定这是快速还是最佳,甚至是正确的编程方式。
答案 12 :(得分:0)
可能不是很优雅,但至少你知道发生了什么。
my_str = "Simple sample, test! is, olny".lower()
my_lst =[]
temp=""
len_my_str = len(my_str)
number_letter_in_data=0
list_words_number=0
for number_letter_in_data in range(0, len_my_str, 1):
if my_str[number_letter_in_data] in [',', '.', '!', '(', ')', ':', ';', '-']:
pass
else:
if my_str[number_letter_in_data] in [' ']:
#if you want longer than 3 char words
if len(temp)>3:
list_words_number +=1
my_lst.append(temp)
temp=""
else:
pass
else:
temp = temp+my_str[number_letter_in_data]
my_lst.append(temp)
print(my_lst)
答案 13 :(得分:-1)
您可以尝试这样做:
tryTrans = string.maketrans(",!", " ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()