Преобразование строки в список слов?

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

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

затем преобразуйте что-то вроде этого :

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

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

13 ответов


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

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 и подчеркивание.

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

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

так 'Привет мир'

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

С re.sub

и затем ['hello', 'world']

после split ()

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


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

>>> string = 'This is a string, with words!'
>>> string.split()
['This', 'is', 'a', 'string,', 'with', 'words!']

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

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

>>> import re
>>> string = 'This is a string, with words!'
>>> re.findall(r'\w+', string)
['This', 'is', 'a', 'string', 'with', 'words']

используя string.punctuation комплектность:

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

это также обрабатывает новые строки.


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

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

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


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


list=mystr.split(" ",mystr.count(" "))

вдохновленный ответом @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']

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

outputList = "".join((c if c.isalnum() or c=="'" else ' ') for c in inputStr ).split(' ')

роль Апострофа кажется интересным.


таким образом, вы устраняете каждый специальный символ вне алфавита:

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']

Я не уверен, что это быстрый или Оптимальный или даже правильный способ программирования.


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

def split_to_words(sentence):
    return list(filter(lambda w: len(w) > 0, re.split('\W+', sentence))) #Use sentence.lower(), if needed

вы можете попробовать и сделать это:

tryTrans = string.maketrans(",!", "  ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()