регулярное выражение для извлечения символов @name из твита - PullRequest
0 голосов
/ 02 марта 2010

Я хотел бы использовать регулярное выражение для извлечения только @patrick @michelle из следующего предложения:

@patrick  @michelle we having diner @home tonight do you want to join?

Примечание: @home не должно включаться в результат, поскольку оно не находится в начале предложения и не сопровождается другим @name.

Любое решение, совет, комментарии будут очень благодарны.

Ответы [ 10 ]

4 голосов
/ 02 марта 2010
/(?:(?:@\S+\s+)+|^)@\S+/g

Сначала он соответствует либо «@», за которым следует множество непробельных символов, либо началу строки, а затем соответствует другому «@», за которым следует множество непробельных символов.

Обратите внимание, что в Твиттере принято, что @name предшествует RT, появляется в середине или конце твита, например, http://twitter.com/ceetee/statuses/9874073403. По сути, вы не можете различить, является ли @name действительно именем, просто используя RegEx или даже парсер. Лучше всего проверить, если http://twitter.com/name 404 или нет.

1 голос
/ 02 марта 2010

Ну, сначала я подумал, что это не удалось, потому что я посмотрел на возвращаемые группы:

>>> tw = re.compile(r"^((@\w*)\s+)*")
>>> tw.findall(tweet)
[('@michelle ', '@michelle')]
>>> tw.match(tweet).groups()
('@michelle ', '@michelle')

Обратите внимание, что группы сохраняют только последнее значение для любой группы в re. Но если вы просто захватите group (), вы получите всю совпадающую строку:

>>> tw.match(tweet).group()
'@patrick  @michelle '

За ухмылки попробую разобраться:

>>> from pyparsing import Word, printables, OneOrMore
>>> atName = Word("@",printables)
>>> OneOrMore(atName).parseString(tweet).asList()
['@patrick', '@michelle']
0 голосов
/ 09 марта 2012

Для C # я бы сделал следующее:

@ ([A-Za-z0-9 -_ &;] +)

0 голосов
/ 27 марта 2010

Для проверки Python: http://github.com/BonsaiDen/AtarashiiFormat
Это также даст вам ссылки и теги.

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

0 голосов
/ 04 марта 2010

В Perl вы можете использовать модификатор /g match-more-than-единый в сочетании с утверждением \G нулевой ширины, где мы остановились и контекст списка, таким образом:

my $str = '@patrick  @michelle we having diner @home tonight do you want to join?';
my @matches = ($str =~ m/\G(\@\w+)\s*/g);

print join(', ', @matches) . "\n";

Это должно быть устойчиво к любому числу начальных @ -строк.

0 голосов
/ 02 марта 2010

для PHP

/^\s*@(\w+)\s+@(\w+)/

Спасибо, КенниМ

в питоне

msg = '@patrick  @michelle we having diner @home tonight do you want to join?'
import re
re.findall('(?:(?:@\S+\s+)+|^)@\S+', msg)

Это работает с 1 или n @name в начале предложения.

Спасибо всем за быстрые ответы.

0 голосов
/ 02 марта 2010

Вы пометили свой пост c #, поэтому я предполагаю, что вы можете использовать .NET Regex. Используя .NET, следующее регулярное выражение будет делать:

(?<![^@]\w+\s+)(@\w+)

Это будет соответствовать любым словам, начинающимся с @, которые не имеют слова без @ перед ними. Обратите внимание, что "ужин @ дом @ 8 вечера" все равно сломает его.

См. здесь для более подробной информации.

0 голосов
/ 02 марта 2010

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

/^\s*(@\w+\s+)*\s+.*$/
0 голосов
/ 02 марта 2010

Пока он начинается с @ и продолжается с теми, которые это сделают, я тестировал его в Poweshell, поэтому некоторые движки регулярных выражений немного отличаются. Это также должно поймать n имен в начале строки

"^ ((@ \ W +) \ s) +"

0 голосов
/ 02 марта 2010

Попробуйте это регулярное выражение:

/^\s*@(\w+)\s+@(\w+)/

\s обозначает пробельные символы и \w слова.

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