2014-11-22 2 views
0

У меня возникают некоторые проблемы, пытающиеся разбить строку пунктуацией. В частности, каждый символ, принадлежащий string.punctuation. Например, для строкиТокенизировать строку, основанную на пунктуации

Вход:

"Hi. How2 are you doing?? " 

Я хотел бы вывод:

['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?') 

Для справки string.punctuation является:

'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~' 

Я хотел бы любой символ в строке, чтобы быть ее собственным токеном.

Я в настоящее время пробовал использовать re.split(). Тем не менее, все, что мне удалось достичь, - это разделение на основе символов, отличных от слов. Например:

print([i for i in re.split(r'(\W+)', 'hi. how are you doing') if i]) 

, который дает выход:

['hi', '. ', 'how', ' ', 'are', ' ', 'you', ' ', 'doing', '??'] 

Кроме того, два '??' должны быть разделены. Какие-либо предложения?

+0

Просто небольшой комментарий, вам не нужно указывать [i для i в re.split (...), если i] ... " если я "полностью избыточен, и если вы действительно не можете просто сказать print (re.split (...)) <Я не знаю, я не знаком с печатью Python 3() или разделом re-модуля ()> вы можете просто сказать print (list (re.split())) –

ответ

1

Вы можете использовать re.findall:

>>> import re 
>>> mystr = "Hi. How2 are you doing?? " 
>>> re.findall(r'[.?]|\w+', mystr) 
['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?'] 
>>> 

Узор выше находит все вхождения ., ? или последовательность из одного или нескольких символов слова. Я сохранил шаблон просто, чтобы продемонстрировать, но любые другие символы пунктуации, которые вы хотите захватить, будут помещены внутри набора символов [...].

Кроме того, вы можете использовать string.punctuation вместо того, чтобы печатать все эти символы пунктуации.

+0

спасибо! Только то, что я искал – user3750474

0

NLTK для этого существуют:

>>> import nltk 
>>> a = "Hi. How2 are you doing?? " 
>>> nltk.sent_tokenize(a) 
['Hi.', 'How2 are you doing?', '? '] 
>>> nltk.word_tokenize(a) 
['Hi.', 'How2', 'are', 'you', 'doing', '?', '?'] 
>>> map(nltk.word_tokenize,nltk.sent_tokenize(a)) 
[['Hi', '.'], ['How2', 'are', 'you', 'doing', '?'], ['?']] 

меня использовать небольшую особенность, NLTK обширна и мощный, посмотрите на него

+0

Обратите внимание, что NLTK является сторонней библиотекой. Он не доступен для стандартной сборки Python. – iCodez

+0

Да, это сторонняя библиотека, но существует для этой цели – Hackaholic

+0

Извините, забыл упомянуть в вопросах, которые я бы не хотел использовать NLTK – user3750474

0

Немного поздно об этом.

Вы должны иметь возможность сделать это с помощью split().

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

Примера: \s+|\b|(?=\pP) разделится на (и потребляет) пропуска, или слово boundry,
или знаки препинания (в прогностическом).

Не есть Python, чтобы проверить с, но в Perl

$data =~ s/^\s+//;  # <- trim leading spaces (a Perl problem) 
    my @vals = split /\s+|\b|(?=\pP)/, $data; 

дает ['Hi', '.', 'How2', 'are', 'you', 'doing', '?', '?']

Для справки, это сырье регулярное выражение это то же самое

\s+|\b|(?=[!"#$%&'()*+,\-./:;<=>[email protected]\[\\\]^_`{|}~]) 

, но с знаки пунктуации в вашем списке.

Обратите внимание, что обратное должно найти все слова и знаки препинания. Для каждого сплита
является отрицательным найти все ...

Смежные вопросы