Преобразование строки в список слов? - PullRequest
56 голосов
/ 31 мая 2011

Я пытаюсь преобразовать строку в список слов, используя python. Я хочу взять что-то вроде следующего:

string = 'This is a string, with words!'

Затем преобразуйте в нечто подобное:

list = ['This', 'is', 'a', 'string', 'with', 'words']

Обратите внимание на отсутствие знаков препинания и пробелов. Какой самый быстрый способ сделать это?

Ответы [ 13 ]

76 голосов
/ 31 мая 2011

Попробуйте это:

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 может быть строкой или функцией.

так в нашем случае:

шаблон - любой не алфавитно-цифровой символ.

[\ w] означает любой буквенно-цифровой символ и равен набору символов [A-Za-Z0-9 _]

от А до Я, от А до Я, от 0 до 9 и подчеркивание.

, поэтому мы сопоставляем любой не алфавитно-цифровой символ и заменяем его пробелом.

и затем мы разделяем его, разделяя строку на пробелы и преобразуя ее в список

так что "привет-мир"

становится 'Привет, мир'

с повтором

и затем ['привет', 'мир']

после разделения ()

дайте мне знать, если возникнут какие-либо сомнения.

69 голосов
/ 06 декабря 2012

Я думаю, что это самый простой способ для любого другого, спотыкающегося в этом посте, учитывая поздний ответ:

>>> string = 'This is a string, with words!'
>>> string.split()
['This', 'is', 'a', 'string,', 'with', 'words!']
29 голосов
/ 31 мая 2011

Сделать это правильно довольно сложно.Для вашего исследования он известен как слово токенизация.Вам следует взглянуть на 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'.']
15 голосов
/ 31 мая 2011

Самый простой способ:

>>> import re
>>> string = 'This is a string, with words!'
>>> re.findall(r'\w+', string)
['This', 'is', 'a', 'string', 'with', 'words']
11 голосов
/ 31 мая 2011

Использование string.punctuation для полноты:

import re
import string
x = re.sub('['+string.punctuation+']', '', s).split()

Это также обрабатывает переводы строки.

5 голосов
/ 31 мая 2011

Ну, вы могли бы использовать

import re
list = re.sub(r'[.!,;?]', ' ', string).split()

Обратите внимание, что string и list являются именами встроенных типов, поэтому вы, вероятно, не хотите использовать их в качестве имен переменных.

3 голосов
/ 31 мая 2011

Регулярное выражение для слов даст вам максимальный контроль. Вы хотели бы тщательно обдумать, как обращаться со словами с черточками или апострофами, такими как «Я».

2 голосов
/ 18 мая 2018

Лично я думаю, что это немного чище, чем ответы

def split_to_words(sentence):
    return list(filter(lambda w: len(w) > 0, re.split('\W+', sentence))) #Use sentence.lower(), if needed
1 голос
/ 08 июня 2017

Вдохновлен ответом @ 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']
1 голос
/ 11 августа 2015
list=mystr.split(" ",mystr.count(" "))
...