регулярное выражение Python для ретвитов - PullRequest
1 голос
/ 17 марта 2009

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

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.)

любая помощь очень ценится. спасибо.

1 Ответ

3 голосов
/ 17 марта 2009

Попробуйте

(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])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...