3 votes

Python regex lookbehind pour supprimer _sublabel1 dans une chaîne comme "__label__label1_sublabel1"

J'ai un ensemble de données que je prépare pour l'entraînement en fasttext et je veux supprimer les sous-étiquettes de l'ensemble de données par exemple:

__label__label1_sublabel1 __label__label2_sublabel1 __label__label3 __label__label1_sublabel4 sometext some sentce som data.

Toute aide est grandement appréciée merci

j'ai essayé ceci:

ptrn = r'(?<=__label__[^_]+)\w+'

ne fonctionne pas code exact:

ptrn = r'(?<=__label__[^_]+)\w+'

re.sub(ptrn, '', test_String)

et cette erreur est survenue:

erreur Traceback (most recent call last) c:\Users\THoseini\Desktop\projects\ensani_classification\tes4t.ipynb Cell 3 in () 1 ptrn = r'(?<=label[^_]+)\w+' ----> 3 re.sub(ptrn, '', test_String)

Fichier c:\Users\THoseini\AppData\Local\Programs\Python\Python310\lib\re.py:209, dans sub(pattern, repl, string, count, flags) 202 def sub(pattern, repl, string, count=0, flags=0): 203 """Retourne la chaîne obtenue en remplaçant les occurrences les plus à gauche 204 non chevauchantes du motif dans la chaîne par le 205 remplacement repl. repl peut être une chaîne ou un rappel; 206 si c'est une chaîne, les échappements avec barre oblique inversée sont traités. S'il s'agit 207 d'une fonction de rappel, l'objet Match est passé et doit retourner 208 une chaîne de remplacement à utiliser."""

Fichier c:\Users\THoseini\AppData\Local\Programs\Python\Python310\lib\re.py:303, dans _compile(pattern, flags) 301 si le motif n'est pas une chaîne: 302 raise TypeError("le premier argument doit être une chaîne ou un motif compilé") --> 303 p = sre_compile.compile(pattern, flags) 304 si (flags & DEBUG): 305 si len(_cache) >= _MAXCACHE: 306 # Supprimer l'élément le plus ancien

Fichier c:\Users\THoseini\AppData\Local\Programs\Python\Python310\lib\sre_compile.py:792, dans compile(p, flags) --> 198 raise error("look-behind requires fixed-width pattern") 199 émettre(lo) # regard en arrière 200 _compile(code, av[1], flags)

erreur: regard en arrière nécessite un motif de largeur fixe

3voto

Ria Points 5743

Essayez cette regex :

(__label__[^_\s]+)\w*

après l'étoile \w au lieu du plus pour éviter de supprimer l'ensemble du label suivant lorsque le label n'a pas de sous-label

et un exemple de code en python :

import re
test_string = """__label__label1_sublabel1 __label__label2_sublabel1 __label__label3 __label__label1_sublabel4 sometext some sentce som data."""

ptrn = r'(__label__[^_\s]+)\w*'
re.sub(ptrn, r'\1', test_string) 

La fonction re.sub() signifie une sous-chaîne et renvoie une chaîne avec les valeurs remplacées. [^character_group] signifie la négation : Correspond à n'importe quel caractère unique qui n'est pas dans character_group. et \w correspond à n'importe quel caractère de mot. \s correspond à n'importe quel caractère d'espace blanc.

et la sortie est comme prévue :

__label__label1 __label__label2 __label__label __label__label1 sometext some sentce som data.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X