Muszę wydobyć słowo po @
Wyodrębnij tekst po określonym znaku
Jak mogę to zrobić? Jakie usiłuję:
text="Hello there @bob !"
user=text[text.find("@")+1:]
print user
wyjściowa:
bob !
Ale poprawne wyjście powinno być:
bob
Muszę wydobyć słowo po @
Wyodrębnij tekst po określonym znaku
Jak mogę to zrobić? Jakie usiłuję:
text="Hello there @bob !"
user=text[text.find("@")+1:]
print user
wyjściowa:
bob !
Ale poprawne wyjście powinno być:
bob
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']
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"
To dobrze, ale co się stanie, jeśli w oryginalnym napisie nie będzie symbolu "@"? – bgstech
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
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
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