J'essaie de faire un nettoyage de données qui nécessite de nettoyer du texte basé sur un modèle spécifique, mais je suis encore assez nouveau sur l'expression régulière, basé sur RegExCheatsheet , je vais essayer une expression régulière simple pour le nettoyage des données (supprimer n'importe quel modèle comme 1000 $ et 1000pcs).
Voici mes exemples de chaînes:
[1] "(Promotion) stuff ABC" [2] "(Trial) stuff XYZ" [3] "(Test) stuff WER"
J'ai essayé la méthode ci-dessous
x <- c("(Promotion) stuff ABC 1pcs", "(Trial) $200 stuff XYZ 20pcs", "(Test) $1000 stuff WER 5000pcs") gsub('$[0-9][0-9][0-9][0-9]','',x) #replace all $200, $1000 & etc.. into "" gsub('[0-9][0-9][0-9][0-9]pcs','',x) #replace all 1pcs, 20pcs, 5000pcs & etc.. into ""
Question: Y a-t-il une meilleure (regex plus dynamique) pour capturer le modèle "200 $ / 5000pcs"? Notez que la plage de données pour $ et pcs est inconnue, peut commencer de 1 à 10000 ou plus.
Résultat attendu (après la sous-chaîne):
[1] "(Promotion) stuff ABC 1pcs" [2] "(Trial) $200 stuff XYZ 200pcs" [3] "(Test) $1000 stuff WER 5000pcs"
Toute aide et commentaire sont les bienvenus, merci!
4 Réponses :
Nous pouvons faire ce qui suit
gsub(" ", " ", trimws(gsub("\\$\\d+|\\d+pcs", "", "$200 $300 stuff XYZ 200pcs"))) # [1] "stuff XYZ"
Ceci remplace un espace suivi de $ et au moins un chiffre ou au moins un chiffre suivi de pcs. Donc, en comparant avec votre approche, j'ai ajouté |
comme opérateur OR et utilisé +
comme pour autoriser un ou plusieurs chiffres (et où \\ d code> est le même que votre
[0-9ITED
).
L'approche ci-dessus suppose que la cible n'est pas au début d'une chaîne. Sinon, nous pouvons faire
x <- c("(Promotion) stuff ABC 1pcs", "(Trial) $200 stuff XYZ 200pcs", "(Test) $1000 stuff WER 5000pcs") gsub(" (\\$\\d+|\\d+pcs)", "", x) # [1] "(Promotion) stuff ABC" "(Trial) stuff XYZ" "(Test) stuff WER"
qui traite des espaces de début / de fin, des espaces blancs et des espaces multiples.
Cela ne fonctionnera pas pour une chaîne comme celle-ci $ 1000 stuff WER 5000pcs
où $ 1000
est au début.
En utilisant gsub
, nous pouvons supprimer de la chaîne tout mot contenant un chiffre et un argument $
facultatif.
gsub("\\$?[0-9]+\\w+", "", x) #[1] "(Promotion) stuff ABC " "(Trial) stuff XYZ " "(Test) stuff WER "
p >
Salut @Ranak Shah, je viens de l'essayer. je travaille quand 200 $ suivent 200pcs, par exemple: '"(Trial) 200 $ stuff XYZ 200pcs"> "(Trial) stuff XYZ"'; mais pourrait ne pas fonctionner si 200 pièces suivent de 200 $.
@ yc.koong Je ne sais pas si je l'obtiens mais cela fonctionne avec gsub ("\\ $? [0-9] + \\ w +", "", "fonctionne si 200pcs suivent de 200 $") < / code>. Voulez-vous dire autre chose?
@Ranak Shah, désolé j'ai fait une erreur stupide, une mauvaise entrée x
. Votre code fonctionne bien! J'ai essayé 'gsub ("\\ $? [0-9] + \\ w +", "", "(Trial) $ 200 stuff XYZ 200pcs")' et j'ai obtenu "(Trial) stuff XYZ "
, et un autre essai sur gsub (" \\ $? [0-9] + \\ w + "," "," fonctionne si 200 pièces suivent de 200 $ ")
, résultat i obtenir "travailler si suivi par"
. Merci!
Une réponse plutôt novice:
#"(Promotion) stuff ABC " "(Trial) stuff XYZ " "(Test) stuff WER "
EDIT: Ou:
x %>% str_remove_all("\\$(?=[0-9]+)") %>% str_remove_all("\\d|pcs")
Même résultat mais plus long:
library(tidyverse) x <- c("(Promotion) stuff ABC 1pcs", "(Trial) $200 stuff XYZ 200pcs", "(Test) $1000 stuff WER 5000pcs") x %>% str_remove_all("\\$(?=[0-9])") %>% str_remove_all("\\d") %>% str_remove_all("pcs")
Vous pouvez utiliser cette expression régulière, qui capture tout texte continu n'ayant pas d'espace à l'intérieur et qui a au moins un chiffre, soit à l'intérieur, soit au début ou à la fin,
[^\s]*\d+[^\s]* ?
Et remplacez-la par une chaîne vide.
vous pouvez essayer ce modèle
\ $? \ d + (\ w {3})?