【问题标题】:String filtering in r using gsub [closed]使用gsub在r中进行字符串过滤[关闭]
【发布时间】:2016-03-04 06:04:47
【问题描述】:

考虑向量

v<-  'I l@ove d**^%ata 33-99//""(Sci"ence==+)'

我想在 R 中使用 gsub 作为清理它

"I Love Data Science"

任何帮助将不胜感激。

【问题讨论】:

    标签: r string gsub


    【解决方案1】:

    这是一个显式替换出现在输入向量中的特殊字符的选项:

    chars <- c("@", "*", "^", "%", "/", "\"", "=", "+", "d", "(", ")", "-")
    gsub(paste("\\", chars, sep="", collapse="|"), "", statement)
    [1] "I love data Science"
    

    请注意,我将 chars 中的每个字符转义为 \\,以防它是 R 正则表达式元字符(如果不是,则不会造成任何伤害)。

    @akrun 给出的答案更简洁,如果一个广泛的字符类涵盖了您想要替换的内容,那么这就是要走的路。我希望这个答案对需要替换一组不完全适合类的单个字符的人有用。

    【讨论】:

      【解决方案2】:

      我们匹配一个或多个不是字母或空格的字符,并将其替换为''[[:alpha:]]+ 本身匹配一个或多个字母字符。但是,假设我们需要做相反的事情,即匹配一个或多个不是字母的字符,使用[^[:alpha:]]+,即在第一个[ 中使用^ 否定匹配。这里我们还需要空格。没有它,我们得到"IlovedataScience"。所以,在比赛中也使用它,即[^[:alpha:] ]+

      gsub("[^[:alpha:] ]+", "", v1)
      #[1] "I love data Science"
      

      或者使用[[:punct:]]匹配任何标点字符并替换为''

      gsub("[[:punct:]]+|[0-9]+", '', v1)
      

      或者代替[[:alpha:]],我们可以将字母指定为[A-Za-z](正如@alistaire 评论的那样)

      gsub('[^A-Za-z ]', '', v1)
      

      更新

      如果 OP 希望每个单词的首字母大写,

      gsub("\\b(.)", "\\U\\1", gsub('[^A-Za-z ]', '', v1), perl=TRUE)
      #[1] "I Love Data Science"
      

      数据

      v1 <- 'I l@ove d**^%ata 33-99//""(Sci"ence==+)'
      

      【讨论】:

      • 我要发布的等价物:gsub('[^A-Za-z ]', '', v1)
      • 这是一个全面的解决方案,可能适用于 OP,但如果需求发生变化,很容易中断。
      • @TimBiegeleisen 当您更改解决方案时,我收回评论。
      • @MilanAmrutJoshi 当然,我会添加更多描述
      • @RHertel 谢谢,没注意到。已更正。
      猜你喜欢
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2021-10-30
      • 2015-08-20
      相关资源
      最近更新 更多