2015-04-24 21 views
6

Ho bisogno di estrarre la parola dopo lo @Estrai testo dopo carattere specifico

Come posso farlo? Quello che sto cercando:

text="Hello there @bob !" 
user=text[text.find("@")+1:] 
print user 

uscita:

bob ! 

Ma l'uscita corretta dovrebbe essere:

bob 

risposta

10

Una soluzione regex per divertimento:

>>> import re 
>>> re.findall(r'@(\w+)', '@Hello there @bob @!') 
['Hello', 'bob'] 
>>> re.findall(r'@(\w+)', 'Hello there bob !') 
[] 
>>> (re.findall(r'@(\w+)', 'Hello there @bob !') or None,)[0] 
'bob' 
>>> print (re.findall(r'@(\w+)', 'Hello there bob !') or None,)[0] 
None 

L'espressione regolare sopra riporterà i motivi di uno o più caratteri alfanumerici seguendo un carattere '@' fino a quando non viene trovato un carattere non alfanumerico.

Ecco una soluzione regex per abbinare uno o più caratteri che non sono spazi se si desidera catturare una gamma più ampia di stringhe:

>>> re.findall(r'@(\S+?)', '@Hello there @bob @!') 
['Hello', 'bob', '!'] 

Si noti che quando il sopra regex incontra una stringa come @[email protected] che catturerà [email protected] in un risultato invece di xyz e abc separatamente. Per risolvere questo, è possibile utilizzare la classe \s carattere negato allo stesso tempo negare @ caratteri:

>>> re.findall(r'@([^\[email protected]]+)', '@[email protected] some other stuff') 
['xyz', 'abc'] 

Ed ecco una soluzione regex per corrispondere a uno o più caratteri alfabetici solo nel caso in cui non si desidera alcun numero o qualsiasi altra cosa :

>>> re.findall(r'@([A-Za-z]+)', '@Hello there @bobv2.0 @!') 
['Hello', 'bobv'] 
+2

stavo proprio per postare questo, poiché la divisione su "@" poteva essere contorta per più nomi (come l'esempio @there) - quindi questa è una di quelle volte che raccomando una regex .... man, picchiando me punch: P;) – JGreenwell

6

Così si vuole la parola che cominci dopo @ fino a uno spazio bianco?

user=text[text.find("@")+1:].split()[0] 
print(user) 
bob 

EDIT: come @bgstech nota, nei casi in cui la stringa non hanno una "@", effettuare un controllo prima:

if "@" in text: 
    user=text[text.find("@")+1:].split()[0] 
else: 
    user="something_else_appropriate" 
+3

Questo è buono, ma cosa succede se non c'è il simbolo '@' nella stringa originale? – bgstech

+0

Bene, in tal caso l'utente sarà la prima sottostringa prima degli spazi bianchi. Non sono sicuro che sia una possibilità nel caso degli OPs, ma aggiungerò una nota nel post. – ODiogoSilva

+0

Sì, @OdiogoSilva, d'accordo, non è forse possibile nel caso dell'OP, ma penso che la tua modifica dia una bella risposta completa - upvoting! – bgstech

Problemi correlati