J'écris actuellement un programme en python où je dois trouver des smileys comme ceux-ci :) , :( , :-) , :-( doit être remplacé s'il est suivi de caractères spéciaux et la ponctuation doit être remplacée dans ce modèle:
ex: Salut, c'est bien :) # doit être remplacé par Salut, c'est bien :) .
J'ai créé un modèle de regex pour le sous-marin mais je n'ai pas pu inclure ce smiley :-) dans ma re.compile . Il considère cela comme une plage.
/ p>
re.sub (r "[^ a-zA-Z0-9 :): D)] +", "", words) cela fonctionne bien
Je dois ajouter un smiley :-) à l'expression régulière.
3 Réponses :
vous pouvez échapper les caractères spéciaux avec \ essayez:
re.sub("[^a-zA-Z0-9:):D:\-))]+", " " , words)
Une approche consiste à utiliser le modèle suivant:
input = "Hi, this is good :)#" output = re.sub(r"(:\)|:\(|:-\)|:-\()[^A-Za-z0-9]+", "\1" , input) print(output) Hi, this is good :)
Cela correspond à et capture un smiley, puis correspond à n'importe quel nombre de caractères non alphanumériques immédiatement après. Le remplacement est juste le smiley capturé, supprimant ainsi les caractères non alpha.
(:\)|:\(|:-\)|:-\()[^A-Za-z0-9]+
Le modèle [^ a-zA-Z0-9 :): D)] est erroné car il s'agit d'une classe de caractères destinée à correspondre à des séquences de caractères. Vous devez ajouter une alternative à cette expression régulière qui correspondra aux séquences de caractères.
Pour supprimer toute ponctuation autre qu'une certaine liste de smileys, vous pouvez utiliser
import re s = "Hi, this is good :)#" print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s) ) # => Hi, this is good :)
Ou, dans Python 3.4 et versions antérieures, en raison du bogue re.sub :
import re s = "Hi, this is good :)#" print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s) ) # => Hi, this is good :)
Si vous devez vraiment éviter de supprimer les virgules, ajoutez , dans la classe de caractères annulée:
re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s)
^
Voir le démo regex .
Détails p>
(: -? [() D]) - correspond et capture dans le groupe 1 un : , puis un - facultatif, et puis un seul caractère de la classe de caractères: (, ) ou D (cela capture les smileys comme : -) code >, :-( , :) , :( , :-D , : D ) [^ A-Za-z0-9, \ s] - correspond à n'importe quel caractère sauf une lettre ASCII, un chiffre, une virgule et un espace. Pour le rendre pleinement compatible Unicode, remplacez-le par (?: [^ \ W \ s,] | _) . Voir la Démo Python 3.5+ :
re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s)
C'est le modèle regex parfait, il ne devrait reconnaître que les smileys plutôt que ")" et ":". Python2 lève une erreur tout en ayant ce modèle regex.it fonctionnera uniquement sur python 3?
@noobster Oui, cela ne fonctionnera avec aucun Python avant Python 3.5 où le problème a été résolu. Utilisez rextester.com/VKR32235 avec les versions antérieures.
@noobster Heureux que cela fonctionne, veuillez alors envisager d'accepter la réponse.
Veuillez vérifier ma réponse , avec une démo et des explications. Notez que le principal problème avec votre modèle est qu'il contient une seule classe de caractères où vous avez ajouté une séquence de modèles à faire correspondre, mais cela ne fonctionne pas comme ça. Vous avez besoin d'un regroupement ici.
Ce n'est pas une promotion éhontée de ma réponse, mais vous pouvez également vérifier ma réponse pour voir si cela a fonctionné pour vous.
@ WiktorStribiżew cela fonctionne parfaitement! mais le même modèle d'expression régulière en python 2 génère une erreur.