python разбить строку - Разделение строки на слова и пунктуацию





4 Answers

Вот версия, поддерживающая Unicode:

re.findall(r"\w+|[^\w\s]", text, re.UNICODE)

Первая альтернатива ловит последовательности словных символов (как определено в unicode, поэтому «резюме» не превратится в ['r', 'sum'] ); второй ловит отдельные символы без слов, игнорируя пробелы.

Обратите внимание, что в отличие от верхнего ответа, это относится к отдельной цитате как отдельной пунктуации (например, «Я» -> ['I', "'", 'm'] ). Это кажется стандартным в НЛП, поэтому я считаю его особенностью.

по нескольким разделителям

Я пытаюсь разбить строку на слова и пунктуацию, добавив пунктуацию в список, созданный разделом.

Например:

>>> c = "help, me"
>>> print c.split()
['help,', 'me']

Я действительно хочу, чтобы список выглядел так:

['help', ',', 'me']

Итак, я хочу, чтобы строка была разделена на пробелы с разделителем пунктуации от слов.

Сначала я попытался разобрать строку, а затем запустить split:

>>> for character in c:
...     if character in ".,;!?":
...             outputCharacter = " %s" % character
...     else:
...             outputCharacter = character
...     separatedPunctuation += outputCharacter
>>> print separatedPunctuation
help , me
>>> print separatedPunctuation.split()
['help', ',', 'me']

Это дает результат, который я хочу, но на больших файлах он очень медленный.

Есть ли способ сделать это более эффективно?




Вот моя запись.

У меня есть сомнения относительно того, насколько хорошо это будет задерживаться в смысле эффективности или если оно уловит все случаи (обратите внимание на «!!!», сгруппированные вместе, это может быть или не быть хорошо).

>>> import re
>>> import string
>>> s = "Helo, my name is Joe! and i live!!! in a button; factory:"
>>> l = [item for item in map(string.strip, re.split("(\W+)", s)) if len(item) > 0]
>>> l
['Helo', ',', 'my', 'name', 'is', 'Joe', '!', 'and', 'i', 'live', '!!!', 'in', 'a', 'button', ';', 'factory', ':']
>>>

Одной из очевидных оптимизаций было бы скомпилировать регулярное выражение перед использованием (с использованием re.compile), если вы будете делать это по очереди.




Я думаю, вы можете найти всю помощь, которую вы можете себе представить в NLTK , тем более, что вы используете python. В учебнике есть хорошее всестороннее обсуждение этой проблемы.




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

string_big = "One of Python's coolest features is the string format operator  This operator is unique to strings"
my_list =[]
x = len(string_big)
poistion_ofspace = 0
while poistion_ofspace < x:
    for i in range(poistion_ofspace,x):
        if string_big[i] == ' ':
            break
        else:
            continue
    print string_big[poistion_ofspace:(i+1)]
    my_list.append(string_big[poistion_ofspace:(i+1)])
    poistion_ofspace = i+1

print my_list



Related