RegEx Tokenizer: разбить текст на слова, цифры, знаки препинания и пробелы (ничего не удалять) - PullRequest
7 голосов
/ 08 августа 2011

I почти нашел ответ на этот вопрос в этой теме (ответ самплебия);однако мне нужно разбить фразу на слова, цифры, знаки пунктуации и пробелы / табуляции.Мне также нужно это, чтобы сохранить порядок, в котором происходит каждая из этих вещей (что уже происходит в коде этого потока).

Итак, я обнаружил что-то вроде этого:

    from nltk.tokenize import *
    txt = "Today it's   07.May 2011. Or 2.999."
    regexp_tokenize(txt, pattern=r'\w+([.,]\w+)*|\S+')
    ['Today', 'it', "'s", '07.May', '2011', '.', 'Or', '2.999', '.']

Но вот список, который мне нужно получить:

    ['Today', ' ', 'it', "'s", ' ', '\t', '07.May', ' ', '2011', '.', ' ', 'Or', ' ', '2.999', '.']

Regex всегда был одной из моих слабых сторон, поэтому после нескольких часов исследований я все еще в тупике.Спасибо !!

Ответы [ 3 ]

4 голосов
/ 08 августа 2011

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

>>> txt = "Today it's \t07.May 2011. Or 2.999."
>>> p = re.compile(r"\d+|[-'a-z]+|[ ]+|\s+|[.,]+|\S+", re.I)
>>> slice_starts = [m.start() for m in p.finditer(txt)] + [None]
>>> [txt[s:e] for s, e in zip(slice_starts, slice_starts[1:])]
['Today', ' ', "it's", ' ', '\t', '07', '.', 'May', ' ', '2011', '.', ' ', 'Or', ' ', '2', '.', '999', '.']
0 голосов
/ 09 августа 2011

Не полностью соответствует ожидаемому результату, который вы предоставили, некоторые подробности в вопросе помогут, но в любом случае:

>>> txt = "Today it's   07.May 2011. Or 2.999."
>>> regexp_tokenize(txt, pattern=r"\w+([.',]\w+)*|[ \t]+")
['Today', ' ', "it's", ' \t', '07.May', ' ', '2011', ' ', 'Or', ' ', '2.999']
0 голосов
/ 08 августа 2011

В регулярном выражении \w+([.,]\w+)*|\S+, \w+([.,]\w+)* захватывает слова и \S+ захватывает другие непробельные символы.

Для того, чтобы захватить пробелы и табуляции, попробуйте следующее: \w+([.,]\w+)*|\S+|[ \t].

...