2009-03-17 2 views
1

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

tweet='foobar [email protected], @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 были добавлены после того, как @ три, он также будет извлечен. Я пробовал много перестановок, чтобы повторить это с + безуспешно.

я также хотел бы, чтобы это работало на что-то вроде

tweet='foobar [email protected], RT @two: RT @three barfoo'; 

, которая может быть достигнута с re.finditer если узоры не перекрывают друг друга. (у меня есть версия, где шаблоны накладываются друг на друга, и поэтому снимается только первый RT).

всякая помощь с благодарностью. Благодарю.

+0

Я думаю, что на это можно ответить здесь: http://stackoverflow.com/questions/558105/string-separation-in-required-format-pythonic-way-with-or-wo-regex –

+0

Нм, это только частичные ответы из-за требования здесь для RT/retweet, извините. –

+0

спасибо за то, что передали это вместе - хотя только частичный ответ, определенно полезный! – jhofman

ответ

3

Попробуйте

(RT|retweet|from|via)(?:\b\W*@(\w+))+' 

Вшита \b\W*@(\w+) в «(? ...)` позволяет группировать условия для повторения без захвата агрегата.

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

(?:(?!RT|@).) 

который будет соответствовать любому символу, который не является «@» или начало «RT», снова не захватывая его.

В этом случае, как насчет:

(RT|retweet|from|via)((?:\b\W*@\w+)+) 

, а затем процесс пост

re.split(r'@(\w+)' ,m.groups()[1]) 

Чтобы получить отдельные ручки?

+0

благодарит за быстрый ответ! , к сожалению, это не похоже на работу, если я не набранный что-то: твит = 'Foobar RT @ один, @two: @three barfoo' м = re.search (г '(RT | ретвит | от | через) (?: \ b \ W * @ (\ w +)) + ', твит) m.groups() (' RT ',' three ') , но я буду читать дальше (?:. ..). Благодарю. – jhofman

+0

спасибо markus. я по сути закончил тем, что пошел с подобным методом, но был обеспокоен тем, что не смог придумать решение с одним регулярным выражением. ценить это. – jhofman

Смежные вопросы