2017-02-22 1 views
0

J'essaie de supprimer tous les champs qui ont des caractères spéciaux (@?.* etc) dans leur texte.Supprimer des champs avec des caractères spéciaux

Je pense que je devrais utiliser

Filter(function(x) {grepl('|[^[:punct:]]).*?', x)} == FALSE, data$V1) 

data$V1 contient mes données. Cependant, il semble que

grepl('|[^[:punct:]]).*?', x) 

échoue avec des exemples triviaux comme

grepl('|[^[:punct:]]).*?', 'M') 

qui délivre TRUE même si M n'a pas de caractères spéciaux. Comment dois-je utiliser grepl pour supprimer des champs avec des caractères spéciaux d'une colonne de données?

+0

Retirez le départ '|'? –

+0

'grepl ('[^ [: alnum:] _] +', c ('m', 'm @', 'M9 *'))' ou 'grepl ('\\ W +', c ('m' , 'm @', 'M9 *')) 'comme le montre l'expression rationnelle help:" Le symbole '\ w 'correspond à un caractère' word '(un synonyme de' [[: alnum:] _] ', un extension) et '\ W' est sa négation' ([^ [: alnum:] _]) '." –

Répondre

2

Pour rechercher "caractères spéciaux", vous pouvez rechercher la négation des caractères alphanumériques en tant que tels:

grepl('[^[:alnum:]_]+', c('m','[email protected]','M9*')) 
# [1] FALSE TRUE TRUE 

ou utiliser le symbole \W

grepl('\\W+', c('m','[email protected]','M9*')) 
# [1] FALSE TRUE TRUE 

\W est expliqué dans le regular expression help:

"Le symbole \ w correspond à un caractère « mot »(un synonyme de [[:alnum:]_], une extension) et \ W est la négation ([^[:alnum:]_]̀)."

+0

Merci pour l'explication approfondie, cela aide beaucoup. – Black

1

Le démarrage d'une expression régulière avec | la rend littéralement inutile car elle correspond à quoi que ce soit.

Voir ce JS exemple:

console.log('With the starting pipe => ' + /|([\W]).*?/.test('M')); 
 
console.log('Without the starting pipe => ' + /([\W]).*?/.test('M'));

1

Tout simplement ceux à l'intérieur [...] et fournir ce à l'argument de modèle à grepl, puis nier.

data$V1[!grepl("[@?.*]", data$V1)] 

Par exemple,

> x <- c("M", "[email protected]", "8.*x") 
> x[!grepl("[@?.*]", x)] 
[1] "M"