2009-04-11 5 views
7

J'ai l'exemple de tweet suivant:RegExp: Comment extraire les noms d'utilisateur de Tweets (twitter.com)?

RT @ utilisateur1: qui sont @thing et @ utilisateur2?

Je veux seulement avoir user1, chose et utilisateur2.

Quelle expression régulière puis-je utiliser pour extraire ces trois noms? PS: Un nom d'utilisateur ne doit contenir que des lettres, des chiffres et des traits de soulignement.

Répondre

16

testés:

/@([a-z0-9_]+)/i 

Dans Ruby (RIR):

>> "RT @user1: who are @thing and @user2?".scan(/@([a-z0-9_]+)/i) 
=> [["user1"], ["thing"], ["user2"]] 

En Python:

>>> import re 
>>> re.findall("@([a-z0-9_]+)", "RT @user1: who are @thing and @user2?", re.I) 
['user1', 'thing', 'user2'] 

En PHP:

<?PHP 
$matches = array(); 
preg_match_all(
    "/@([a-z0-9_]+)/i", 
    "RT @user1: who are @thing and @user2?", 
    $matches); 

print_r($matches[1]); 
?> 

Array 
(
    [0] => user1 
    [1] => thing 
    [2] => user2 
) 
+0

Vous devez ajouter un groupe de capture autour du [a-z0-9_], à savoir @ ([a-zA-Z0-9 _] +) –

+0

Merci, ça fonctionne bien! Une dernière question: Quand il doit y avoir un espace avant le "@" ou qu'il doit être au début, puis-je utiliser l'expression suivante? "/ (| ^) @ ([a-z0-9 _] +)/i" – caw

+0

Utiliser lookbehind - http://www.regular-expressions.info/lookaround.html – user4812

0

Cela devrait le faire (je nommais utilisé des captures pour plus de commodité).?

+ @ (? [A-zA-Z0-9 _] +):? [^ @] + @ ([^ \ s] +) [^ @] + @ ([a-zA-Z0-9 _] +)

+0

PHP affiche un message d'erreur lorsque j'utilise votre expression. Quelque chose comme "délimiteur manquant à la fin" ou plus. – caw

1

essayer un iterator (de findall) avec cette regex:?

(@[\w-]+) 

bye

+0

simple ... bien! combiner avec scan (ruby) pour obtenir un tableau de correspondances: text.scan (/ @ [\ w -] + /) – Danny

2
/(?<!\w)@(\w+)/ 

Ce qui précède couvre le scénario suivant, quelle autre réponse s dans ce fil:

  • Un signe @ qui n'est pas supposé être un nom d'utilisateur, par ex. "mon email est [email protected]"
  • Permet toujours un nom d'utilisateur qui est au début d'une chaîne, par ex. "@username lorem ipsum ..."
+0

Merci. Personne d'autre ne considère jamais le problème d'adresse e-mail! – innonate

0

Est une bonne idée d'inclure la bibliothèque de texte Twitter [1] dans votre projet pour résoudre ce problème de texte.

twttr.txt.extractMentions("a very generic twitt with some @mention"); 

[1] https://github.com/twitter/twitter-text-js

Questions connexes