A expressão regular mais trabalhosa, até agora, foi a seguinte, que serve para capturar menções, ou seja, nomes precedidos por @, mas que não são emails.
O mais difícil foi perceber que a expressão (?<=\@)\w+
não devolve o @ para o negative lookbehind anterior, e por isso é que tive que usar o @ também no negative lookbehind (?<!\w\@)
.
Eis o código:
#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import unicode_literals import re import collections line = "@mary call @john or send him an email @ john2@gmail.com also tell @mary that I cannot go. Regards @estêvão" p = re.compile(ur'(?i)(?<!\w\@)((?<=\@)\w+)',re.U) r = p.findall(line) cnt = collections.Counter(r) print cnt for key, value in cnt.iteritems(): print key, value
e o resultado, com contagem de ocorrências:
Counter({u'mary': 2, u'est\xeav\xe3o': 1, u'john': 1}) estêvão 1 john 1 mary 2 gmail 1