删除具有特殊字符的字段

Remove fields with special characters

我正在尝试删除文本中包含特殊字符(@?.* 等)的所有字段。

我想我应该使用

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

其中 data$V1 包含我的数据。不过好像

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

在像

这样的小例子中失败
grepl('|[^[:punct:]]).*?', 'M')

即使 M 没有特殊字符,它也会输出 TRUE。我应该如何使用 grepl 从数据列中删除带有特殊字符的字段?

| 开头的正则表达式会使它毫无用处,因为它将匹配 任何东西.

参见这个 JS 示例:

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

要搜索"special characters",您可以搜索字母数字字符的否定:

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

或使用符号\W

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

\Wregular expression help中有解释:

"The symbol \w matches a ‘word’ character (a synonym for [[:alnum:]_], an extension) and \W is its negation ([^[:alnum:]_]̀)."

只需将这些放在 [...] 中并将其提供给 grepl 的模式参数,然后取反。

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

例如,

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