tokenize строку, содержащую разделители в Python

Есть ли эквивалент str.split в Python, который также возвращает разделители?

Мне нужно сохранить пробельный макет для моего вывода после обработки некоторых токенов.

Пример:

 >>> s="\tthis is an example" >>> print s.split() ['this', 'is', 'an', 'example'] >>> print what_I_want(s) ['\t', 'this', ' ', 'is', ' ', 'an', ' ', 'example'] 

Благодаря!

5 Solutions collect form web for “tokenize строку, содержащую разделители в Python”

Как насчет

 import re splitter = re.compile(r'(\s+|\S+)') splitter.findall(s) 
 >>> re.compile(r'(\s+)').split("\tthis is an example") ['', '\t', 'this', ' ', 'is', ' ', 'an', ' ', 'example'] 

модуль re обеспечивает такую ​​функциональность:

 >>> import re >>> re.split('(\W+)', 'Words, words, words.') ['Words', ', ', 'words', ', ', 'words', '.', ''] 

(цитируется в документации Python).

Для вашего примера (разделить на пробелы) используйте re.split('(\s+)', '\tThis is an example') .

Ключ состоит в том, чтобы заключить регулярное выражение, в которое нужно разбить захват круглых скобок. Таким образом, разделители добавляются в список результатов.

Изменить: Как указано, любые предыдущие / конечные разделители, конечно, также будут добавлены в список. Чтобы избежать этого, вы можете сначала использовать метод .strip() в своей строке ввода.

Вы смотрели на пипаринг? Пример, заимствованный из вики-файла pyparsing :

 >>> from pyparsing import Word, alphas >>> greet = Word(alphas) + "," + Word(alphas) + "!" >>> hello1 = 'Hello, World!' >>> hello2 = 'Greetings, Earthlings!' >>> for hello in hello1, hello2: ... print (u'%s \u2192 %r' % (hello, greet.parseString(hello))).encode('utf-8') ... Hello, World! → (['Hello', ',', 'World', '!'], {}) Greetings, Earthlings! → (['Greetings', ',', 'Earthlings', '!'], {}) 

Спасибо, ребята, указав на модуль re , я все еще пытаюсь решить между этим и использовать свою собственную функцию, которая возвращает последовательность …

 def split_keep_delimiters(s, delims="\t\n\r "): delim_group = s[0] in delims start = 0 for index, char in enumerate(s): if delim_group != (char in delims): delim_group ^= True yield s[start:index] start = index yield s[start:index+1] 

Если бы у меня было время, я бы сравнил их с xD

  • Как использовать токенизатор по умолчанию для NLTK, чтобы получить пробелы вместо строк?
  • Tokenizer с Pyigs в Python
  • Невозможно правильно пометить предложение хинди
  • Написание токенизатора в Python
  • Токизация арабских слов с использованием NLTK
  • Заполнение нескольких символов пробелом - python
  • Python - лучший язык программирования в мире.