2012-08-27 4 views
-2

Possible en double:
Regex to Match White Space or End of StringAvec python, quel est le moyen le plus efficace pour collecter le texte entre 2 symboles dans une chaîne?

Ainsi, si un utilisateur soumet une zone de texte contenant le symbole @ (de @username), comment puis-je saisir efficacement le nom d'utilisateur entre le @ et le suivant espace?

De même, il peut y avoir plusieurs utilisateurs @ dans une soumission, de sorte qu'ils aimeraient que chacun soit ajouté à une liste, mais seulement s'il ne figurait pas déjà dans la liste.

+2

Etes-vous sûr que vous voulez dire « entre le @ et l'espace suivant »? Que voulez-vous '@ person1, @ person2, @ person3' pour revenir? – DSM

+0

Qu'avez-vous essayé qui ne fonctionne pas? – geoffspear

+0

Votre question a pour tag '[regex]', pouvez-vous poster ceux que vous avez essayés? –

Répondre

0

Efficace en termes de quoi? Temps de codage? essayez une expression régulière:

import re 
re.findall(r'@([^\s]*)',"this is @astring with @another one") 
+0

Efficace comme dans glisser sur l'ordinateur pour répéter fréquemment sur une grande quantité de texte – chrickso

1

Si vous le faites pour beaucoup de texte, regex est plus facile:

import re 
mystring = " Hello there @ben, my name is @bob" 
re.findall(r'@(\w+)', mystring) 

// ['ben', 'bob'] 
1

sans regex solution:

>>> strs="@user some text @user2" 
>>> [x.split()[0] for x in strs.split('@')[1:] if x.strip()!=''] 
['user', 'user2'] 

>>> strs1="hello I am @user1 and he's @user2" 
>>> [x.split()[0] for x in strs1.split('@')[1:] if x.strip()!=''] 
['user1', 'user2'] 

modifier:

lis=[] 
strs="hello I am @user1 and he's @user2, as per @user3, @user2 is older than @user1" 
for x in strs.split('@')[1:]: 
    x=x.split()[0].strip().strip(',";.') #strip punctuation marks 
    if x not in lis:  #if not in lis 
     lis.append(x) 

print lis 

sortie:

['user1', 'user2', 'user3'] 
+0

Qu'en est-il de ne pas ajouter à la liste si elle existe déjà? Si vous faites cela à une grande quantité de texte, est-ce plus rapide à tranchant ou non-regex? – chrickso

+0

@chrickso J'ai édité ma réponse selon votre commentaire. Mais si vous voulez seulement utiliser les compréhensions de listes, vous pouvez utiliser 'set()' pour supprimer les noms répétés. –

+0

@chrickso, lors de l'évaluation de la vitesse du code, le seul moyen fiable est de le comparer vous-même. Vous avez maintenant au moins deux solutions possibles, il devrait donc être facile pour vous d'essayer. –

Questions connexes