R中的正则表达式匹配一个只有非单词字符的单词

Regex Expression in R to match a word with only non-word characters

尝试删除所有仅包含非单词字符或仅包含标点符号的单词(被空格包围的字符)。

**My string:**  df <-c("****+++++01293-0129-= *& ==============( ----------------( hi 102938=-0 123ho123")


**Intended output:"****+++++01293-0129-= hi 102938=-0 123ho123"

尝试过:

df <- gsub(pattern = "[[:punct:]]*span[[:punct:]]*", "", df)

df <-gsub(pattern = "\<\W*\W*\>", "", df)

df <-gsub(pattern = "^\W*\W*$", "", df)

None 这些工作用于删除每个包含纯标点符号的单词。

不是最干净的,但应该可以

paste(grep("[[:alnum:]]",strsplit(df," ")[[1]],value=TRUE),collapse=" ")
[1] "****+++++01293-0129-= hi 102938=-0 123ho123"

此处我们将字符串拆分为 " " 并检查是否至少有一个字母数字值。然后用 " " 作为分隔符再次粘贴那些。

您可以尝试搜索模式:

(?<=^|\s)[^A-Za-z0-9_]+(?=$|\s)

然后替换为空字符串。例如:

input <-c("****+++++01293-0129-= *& ==============( ----------------( hi 102938=-0 123ho123")
output <- gsub("(?<=^|\s)[^A-Za-z0-9_]+(?=$|\s)", "", input, perl=TRUE)
output

[1] "****+++++01293-0129-=  hi 102938=-0 123ho123"

正则表达式模式中的秘诀是使用环视作为我们通常使用单词边界 (\b) 所做的代理。这里的问题是 单词字符和 space 之间的界面实际上不是单词边界。因此,我们可以将我们的边界定义为非单词字符和以下之一之间的接口:

  • 字符串的开头
  • 字符串结束
  • 一个space个字符