Подтвердить что ты не робот

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

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

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

Затем преобразуется в нечто вроде этого:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

с re.sub

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

после split()

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Используя string.punctuation для полноты:

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

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

Ответ 6

Хорошо, вы могли бы использовать

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

Роль апострофа кажется интересной.

Ответ 12

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

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

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

Ответ 13

Вы можете попробовать:

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