Я придумал способ токенизации всех слов и \W+
шаблонов с использованием \b
, который не требует жесткого кодирования:
>>> import re
>>> sentence = 'Hello, world!'
>>> tokens = [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', sentence)]
['Hello', ',', 'world', '!']
Здесь .*?\S.*?
- это шаблон, соответствующий всему, что не является пробелом, и $
добавляется для соответствия последнему токену в строке, если это символ пунктуации.
Обратите внимание на следующее, хотя это сгруппирует пунктуацию, состоящую из более чем одного символа:
>>> print [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', '"Oh no", she said')]
['Oh', 'no', '",', 'she', 'said']
Конечно, вы можете найти и разделить такие группы с помощью:
>>> for token in [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', '"You can", she said')]:
... print re.findall(r'(?:\w+|\W)', token)
['You']
['can']
['"', ',']
['she']
['said']