2017-02-22 35 views
0

Я пытаюсь удалить все поля, которые имеют специальные символы (@?.* и т. Д.) В их тексте.Удалить поля со специальными символами

Я думаю, что я должен использовать

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

где data$V1 содержит мои данные. Однако, похоже,

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

терпит неудачу с тривиальными примерами как

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

, который выводит TRUE даже если M не имеет специальных символов. Как я должен использовать grepl для удаления полей со специальными символами из столбца данных?

+0

Удалить начальный '|'? –

+0

'grepl ('[^ [: alnum:] _] +', c ('m', 'm @', 'M9 *'))' или 'grepl ('\\ W +', c ('m' , 'm @', 'M9 *')) ', как видно из справки регулярного выражения:« Символ '\ w' соответствует символу« word »(синоним« [[: alnum:] _] », расширение), а '\ W' - его отрицание' ([^ [: alnum:] _]) '." –

ответ

2

Для поиска "специальных символов", вы можете искать отрицание алфавитно-цифровых символов, как, например:

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

или используйте символ \W

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

\W объясняется в regular expression help:

"Символ \ ш совпадает с„слово“символ (синоним [[:alnum:]_], расширение) и \ W является его отрицанием ([^[:alnum:]_]̀)"

+0

Благодарим вас за подробное объяснение, это очень помогает. – Black

1

Запуск регулярного выражения с помощью | сделать его буквально бесполезным, так как оно будет соответствовать что угодно.

Посмотрите этот JS пример:

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

1

Просто положите их в [...] и обеспечить это в шаблон аргумента grepl, то свести на нет.

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

Например,

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