Je dois supprimer les mots commençant par une barre oblique inverse d'une chaîne. J'ai essayé ce qui suit (et de légères variations) mais les mots ne sont pas supprimés.
test = "(students u2019 education, 1, 3) || (DCUCampaign 8, 2, 2) || (Projects Stories, 1, 2) || (DCU, 14, 1) || (u201c DCU graduate u201d, 1, 4)"
Voici la regex que j’ai essayé:
re.sub(r"b\w+", "", str(test))
Réponses:
1 pour la réponse № 1Tu devrais utiliser:
re.sub(r"\w+", "", str(test))
Vous n'avez pas besoin de limite de mots b
, juste une barre oblique inverse et des caractères de mot. Une limite de mot b
est un personnage virtuel entre non-wordcaractères et un mot caractères, parce que exemple de caractères non-mot: espace, barre oblique inverse et quelques autres. Donc, ce que vous faisiez est de vérifier qu’un mot commence et que le mot commence par une barre oblique inverse, qui s’exclut mutuellement.
1 pour la réponse № 2
Depuis le est un caractère autre qu'un mot, pour empêcher la correspondance
word
dans textword
, vous devez utiliser un B
- une limite de non-mot qui correspond aux endroits où b
ne correspond pas.
En bref: B
correspond au début de la chaîne avant un caractère autre qu'un mot, ou à la fin de la chaîne après un caractère autre qu'un mot, ou entre les caractères du même type (c'est-à-dire entre bb
, b1
, b_
, ,.
, etc.).
Voir plus d'explication ici, Pas un mot limite: B
à rexegg.com.
Utilisation
re.sub(r"B\w+", "", str(test))
^^
Si vous devez définir la limite Unicode sans limite de mot, n'oubliez pas de passer le flags=UNICODE
.
0 pour la réponse № 3
Comme plus de gens l’ont souligné dans les commentaires, c’est que u2019
est en fait une séquence d'échappement Unicode, qui sera étendue à ’
. Cette fonctionnalité est uniquement disponible dans Python 3+. Vous pouvez la remplacer par: r"u2019"
. Ou en Python 2 avec u"u2019"
.
Mais vous remarquerez bientôt que ne remplace que ce caractère, mais si vous souhaitez remplacer tous les caractères non ascii, utilisez la regex suivante:
r"[^x00-x7F]+"
0 pour la réponse № 4
le u2019
est en fait pas u2019
mais plutôt le Right Single Quotation Mark
: '
Il est encodé dans unicode
et est juste un caractère.
Un autre exemple:
C'est le caractère de nouvelle ligne: n
Dans votre code cela ne sera pas imprimé n
mais plutôt une nouvelle ligne (comme en appuyant sur ENTRER).
Pour supprimer toutes les valeurs Unicode qui ne figurent pas dans l'espace de caractère ascii (0 à 127), utilisez le code suivant:
text = "".join([i if ord(i) < 128 else "" for i in text])
Ou si vous voulez les remplacer par un espace " "
:
text = "".join([i if ord(i) < 128 else " " for i in text])
Vous pouvez également utiliser une expression rationnelle comme suit:
re.sub(r"[^x00-x7F]+", " ", text)
Remarque: x7F
est 127 en hexadécimal.