【问题标题】:Regex Expression in R to match a word with only non-word charactersR中的正则表达式匹配仅包含非单词字符的单词
【发布时间】:2019-07-25 13:46:45
【问题描述】:

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

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

这些都不能删除包含纯标点字符的每个单词。

【问题讨论】:

    标签: r regex gsub stringr


    【解决方案1】:

    您可以尝试搜索模式:

    (?<=^|\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) 的代理。这里的问题是 non 单词字符和空格之间的接口实际上不是单词边界。因此,我们可以将边界定义为非单词字符与以下之一之间的接口:

    • 字符串的开头
    • 字符串的结尾
    • 空格字符

    【讨论】:

      【解决方案2】:

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

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

      这里我们用" " 分割字符串并检查是否至少有一个字母数字值。然后用" " 作为分隔符再次粘贴。

      【讨论】:

      • 不使用PCRE正则表达式库但使用R语法的好答案,适合不熟悉PCRE的人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      相关资源
      最近更新 更多