2015-04-24 16 views

Odpowiedz

10

Roztwór regex dla zabawy:

>>> 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 

Powyższe wyrażenie zbierackie pobiera wzorce jednego lub więcej znaków alfanumerycznych następujących po znaku "@", dopóki nie zostanie znaleziony znak niealfanumeryczny.

Oto rozwiązanie regex dopasować jeden lub więcej znaków spoza whitespace jeśli chcesz uchwycić szerszy zakres podciągi:

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

Zauważ, że gdy powyższe regex napotyka ciąg jak @[email protected] będzie przechwytywać [email protected] w jednym wyniku zamiast xyz i abc osobno. Aby to naprawić, można użyć negujące klasę \s znaków jednocześnie negując @ znaki:

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

A oto rozwiązanie regex dopasować jeden lub więcej znaków alfabetu tylko w przypadku, gdy nie chcemy żadnych cyfr lub czegokolwiek innego :

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

Już miałem to opublikować, ponieważ dzielenie na @ może być zawiłe dla wielu nazw (np. @there przykład) - więc jest to jeden z tych razy polecam regex .... człowieka, pokonując mnie do cios: P;) – JGreenwell

6

Więc chcesz słowo rozpoczynające się od @ do białych znaków?

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

EDIT: jak @bgstech pod uwagę w przypadkach, gdy łańcuch nie ma "@", wykonać test przed:

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

To dobrze, ale co się stanie, jeśli w oryginalnym napisie nie będzie symbolu "@"? – bgstech

+0

Cóż, w takim przypadku użytkownik będzie pierwszym podciąganiu przed białymi znakami. Nie jestem pewien, czy jest to możliwe w przypadku OP, ale dodam notatkę w poście. – ODiogoSilva

+0

Yeah @OdiogoSilva, zgodziłem się, że nie jest to możliwe w przypadku OP, ale myślę, że twoja edycja daje fajną kompletną odpowiedź - przegrywanie! – bgstech

Powiązane problemy