2
votes

Comment sous-chaîne un caractère dynamique avec numérique (par exemple: 1000 $, 100 unités)

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!


1 commentaires

vous pouvez essayer ce modèle \ $? \ d + (\ w {3})?


4 Réponses :


6
votes

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.


1 commentaires

Cela ne fonctionnera pas pour une chaîne comme celle-ci $ 1000 stuff WER 5000pcs $ 1000 est au début.



2
votes

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 >


3 commentaires

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!



0
votes

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")


0 commentaires

1
votes

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.

Démo


0 commentaires