【问题标题】:how to remove words of specific length in a string in R?如何删除R中字符串中特定长度的单词?
【发布时间】:2016-01-18 12:29:09
【问题描述】:

我想删除字符串中长度小于 3 的单词。例如我的输入是

str<- c("hello RP have a nice day")

我希望我的输出是

str<- c("hello have nice day")

请帮忙

【问题讨论】:

  • 最好不要使用 str 作为变量名。 str 是 R 的内置函数。
  • gsub(' . | .. ', ' ', s)

标签: regex r string trim gsub


【解决方案1】:

试试这个:

gsub('\\b\\w{1,2}\\b','',str)
[1] "hello  have  nice day"

编辑 \b 是单词边界。如果需要删除额外的空间,将其更改为:

gsub('\\b\\w{1,2}\\s','',str)

或者

gsub('(?<=\\s)(\\w{1,2}\\s)','',str,perl=T)

【讨论】:

  • 也许添加一些关于正则表达式在做什么的解释?
  • 我喜欢只使用基数 R 的方法。但是所有三种解决方案都犯了以下三个“错误”之一:(1) 当通过减号连接到更长的子字符串时,删除长度为 1 或 2 的子字符串(如“共同选择”); (2) 不删除字符串末尾长度为1或2的子字符串; (3) 不删除字符串开头的子字符串。第一个解决方案犯了第一个错误,第二个解决方案犯了第二个错误,第三个解决方案犯了第二个和第三个错误。我怎样才能不犯这些错误?
【解决方案2】:

或者使用str_extract_all提取所有长度>=3和paste的单词

library(stringr)
paste(str_extract_all(str, '\\w{3,}')[[1]], collapse=' ')
#[1] "hello have nice day"

【讨论】:

  • 尝试此操作时出现错误。SubConsolData$ProductTitle &lt;- paste(str_extract_all(SubConsolData$ProductTitle, '\\w{3,}')[[1]], collapse=' ') 错误是 DF 的第一行 (SubConsolData) 重复到 DF 中的所有其余行。
  • @I_m_LeMarque 这是因为我们正在提取第一个元素[[1]]。在这种情况下,只有一个字符串。在您的情况下,您可能需要循环然后执行paste
【解决方案3】:

这是一种使用 qdapRegex 包中的rm_nchar_words 函数的方法,该包是我与@hwnd(SO regex guru extraordinaire)共同创作的。在这里,我展示了删除 1-2 个字母的单词,然后是 1-3 个字母的单词:

str<- c("hello RP have a nice day")

library(qdapTools)

rm_nchar_words(str, "1,2")
## [1] "hello have nice day"

rm_nchar_words(str, "1,3")
## [1] "hello have nice"

qdapRegex 旨在在这里教授正则表达式,其中S 函数将1,2 放入量词花括号中:

S("@rm_nchar_words", "1,2")
##  "(?<![\\w'])(?:'?\\w'?){1,2}(?![\\w'])"

【讨论】:

    【解决方案4】:
    x <- "hello RP have a nice day"
    z <- unlist(strsplit(x, split=" "))
    paste(z[nchar(z)>=3], collapse=" ")
    # [1] "hello have nice day"
    

    【讨论】:

      猜你喜欢
      • 2014-07-03
      • 2014-02-26
      • 2017-11-03
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多