-2
votes

python regex: comment trouver des identifiants dans une chaîne commençant par @

J'ai besoin de trouver des identifiants dans une chaîne, dans les applications de médias sociaux.

comme ça:

an id: @username1
another id:@username2
not an id@username3

mon problème principal est qu'il devrait être au début du mot et s'il n'a pas d'espace devant lui, comme ce caractère: " : " (exemple: ligne deux) il sera considéré comme un identifiant


6 commentaires

essayez ceci: (?<!id)@username voir la démo: regex101.com/r/i3idG5/1


J'ai essayé ceci: r'\b@\S+' mais il ne répond pas


Quelle est l'attente de production?


Je m'attends à ce qu'il renvoie un tableau de tous les mots qui correspondent à la condition: ['@ username1', '@ username2'] ... où les deux proviennent des lignes un et deux


Que se passe-t-il si vous avez @#username ? Doit-il être retourné?


@ dani-mesejo non il ne doit pas être revu


3 Réponses :


0
votes

Vous pouvez essayer ceci

(?!\b\W+\b):?\s*@\w+

Fondamentalement, vous voulez capturer la chaîne (@username) qui présente soit après le optionnel : soit un espace blanc.

Démo


7 commentaires

cela n'a pas fonctionné, il renvoie toujours un tableau vide, (j'ai vérifié ma syntaxe, ça va)


vérifiez ceci: regex101.com/r/cjEr2i/1 les deux derniers doivent correspondre


@HamidBakhtiari vous voulez obtenir un identifiant ou un nom d'utilisateur? c'est la sortie que vous voulez ['@username', '@username'], non?


cette sortie est exactement correcte, mais l'expression régulière que vous avez envoyée ne fonctionne pas dessus!


avez-vous essayé ceci (?!\b\W+\b):?\s*@\w+ ?


celui-ci fonctionne parfaitement mettre à jour votre réponse


il y a une chose: je ne voulais pas simplement dire le caractère facultatif : je voulais dire n'importe quoi mais pas un espace ou une lettre



1
votes

Essaye ça:

\B@\w+

Voir la démo

Code:

import re

text = """an id: @username1
another id:@username2
not an id@username
"""
print(re.findall('\B@\w+', text))

Voir la démo de Python3


1 commentaires

vérifiez ceci: regex101.com/r/rDac0w/1 le dernier ne doit pas être un identifiant car il commence immédiatement après un mot ...



0
votes

les deux réponses ci-dessus fonctionnent très bien, mais j'ai trouvé un autre regex qui fonctionne:

text = '@@username1 and this: @username2 and@notusername and:@username3'

res = re.findall(r'(?<!\w)@\w+', text)

print(res) # ['@username1', '@username2', '@username3']

voici le code pour l'utiliser:

(?<!\w)@\w+


0 commentaires