Я работаю над регулярным выражением, которое будет извлекать ключевые слова и имена пользователей из твитов. здесь пример, с довольно страшным регулярным выражением, чтобы выполнить эту работу:
tweet='foobar RT@one, @two: @three barfoo'
m=re.search(r'(RT|retweet|from|via)\b\W*@(\w+)\b\W*@(\w+)\b\W*@(\w+)\b\W*',tweet)
m.groups()
('RT', 'one', 'two', 'three')
то, что я хотел бы, состоит в том, чтобы конденсировать повторяющиеся шаблоны \b\W*@(\w+)\b\W*
и сделать их переменным числом, так что если @four были добавлены после @three, он также будет извлечен. Я пробовал много перестановок, чтобы повторить это с помощью +
безуспешно.
Мне также понравилось бы работать над чем-то вроде
tweet='foobar RT@one, RT @two: RT @three barfoo';
который может быть достигнут с помощью re.finditer, если шаблоны не перекрываются. (у меня есть версия, в которой шаблоны перекрываются, и поэтому получает только первый RT).
любая помощь приветствуется. спасибо.
Try
(RT|retweet|from|via)(?:\b\W*@(\w+))+'
Включение \b\W*@(\w+)
in '(?:...) `позволяет группировать термины для повторения без захвата совокупности.
Я не уверен, что следую второй части вашего вопроса, но я думаю, что вы можете искать что-то с конструкцией вроде:
(?:(?!RT|@).)
который будет соответствовать любому символу, который не является "@" или началом "RT", снова без его захвата.
В этом случае, как насчет:
(RT|retweet|from|via)((?:\b\W*@\w+)+)
а затем отправить процесс
re.split(r'@(\w+)' ,m.groups()[1])
Чтобы получить отдельные дескрипторы?