Как составить группу для каждого слова в предложении? - PullRequest
4 голосов
/ 08 июля 2010

Это может быть глупый вопрос, но ...

Скажем, у вас есть предложение вроде:

Быстрая коричневая лиса

Или вы можете получить предложение вроде:

Быстрая коричневая лиса перепрыгнула через ленивую собаку

Простое регулярное выражение (\ w *) находит первое слово «The» и помещает его в группу.

В первом предложении вы можете написать (\ w *) \ s * (\ w *) \ s * (\ w *) \ s * (\ w *) \ s *, чтобы каждое слово имело свое группа, но это предполагает, что вы знаете количество слов в предложении.

Можно ли написать регулярное выражение, которое помещает каждое слово в любом произвольном предложении в свою группу? Было бы неплохо, если бы вы могли сделать что-то вроде (?: (\ W *) \ s *) *, чтобы он группировал каждый экземпляр (\ w *), но это не работает.

Я делаю это в Python, и мой сценарий использования, очевидно, немного сложнее, чем "Быстрый коричневый лис", поэтому было бы неплохо, если бы Regex мог сделать это в одну строку, но если это невозможно, то я предполагаю, Следующее лучшее решение - перебрать все совпадения, используя re.findall () или что-то подобное.

Спасибо за ваше понимание.

Редактировать: Для полноты изложения приведу мой фактический пример использования и то, как я решил его, используя вашу помощь Еще раз спасибо.

>>> s = '1 0 5 test1 5 test2 5 test3 5 test4 5 test5'
>>> s = re.match(r'^\d+\s\d+\s?(.*)', s).group(1)
>>> print s
5 test1 5 test2 5 test3 5 test4 5 test5
>>> list = re.findall(r'\d+\s(\w+)', s)
>>> print list
['test1', 'test2', 'test3', 'test4', 'test5']

Ответы [ 4 ]

6 голосов
/ 08 июля 2010

Вы также можете использовать функцию findall в модуле re

import re
>>> re.findall("\w+", "The quick brown fox")
['The', 'quick', 'brown', 'fox']
5 голосов
/ 08 июля 2010

Я не верю, что это возможно. Регулярные выражения объединяют перехваты с круглыми скобками в данном регулярном выражении ... если вы перечислили только одну группу, например '((\ w +) \ s +) {0,99}', то она просто многократно перехватит одну и ту же первую вторая группа ... не создавать новые группы для каждого найденного совпадения.

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

Вместо этого вы можете использовать re.split, который может разбивать регулярное выражение и давать ему \ s для соответствия любому пробелу. Вы, вероятно, хотите, чтобы он совпадал с \ s +, чтобы жадно собирать пробелы.

>>> import re
>>> help(re.split)
Help on function split in module re:

split(pattern, string, maxsplit=0)
    Split the source string by the occurrences of the pattern,
    returning a list containing the resulting substrings.

>>> re.split('\s+', 'The   quick brown\t fox')
['The', 'quick', 'brown', 'fox']
>>>
3 голосов
/ 08 июля 2010

Зачем использовать регулярное выражение, если string.split делает то же самое?

>>> "The quick brown fox".split()
['The', 'quick', 'brown', 'fox']
1 голос
/ 08 июля 2010

Регулярные выражения не могут группироваться в неизвестное количество групп.Но в вашем случае есть надежда.Посмотрите на метод split, он должен помочь в вашем случае.

...