繁体   English   中英

替换包含模式的整个单词 - gsub 和 R

[英]Replace a whole word containing a pattern - gsub and R

我正在尝试从一些文本中清除一些垃圾。 在这样做时,我假设任何有一个字母(任何字母)重复三次或更多次的单词都是垃圾 - 我想删除它。

我想出了这个:

gsub(pattern = "[a-zA-Z]\\1\\1", replacement = "", string)

其中string是字符向量,但这不起作用。 我尝试过的所有其他事情都可能找到模式,但它只是删除了模式,留下了一团糟。 我正在尝试删除带有模式的整个单词。

有任何想法吗?

您需要将“捕获组”分配给[.] class,方法是将其包装在括号中,因为\\1需要参考:

gsub("([a-zA-Z])\\1\\1", "", "aabbbccdddee")
# [1] "aaccee"

你需要

gsub("\\s*[[:alpha:]]*([[:alpha:]])\\1{2}[[:alpha:]]*", "", string)
gsub("\\s*\\p{L}*(\\p{L})\\1{2}\\p{L}*", "", string, perl=TRUE)
stringr::str_replace_all(string, "\\s*\\p{L}*(\\p{L})\\1{2}\\p{L}*", "")

请参阅R 演示

string <- "This is a baaaad unnnnecessary short word"
gsub("\\s*[[:alpha:]]*([[:alpha:]])\\1{2}[[:alpha:]]*", "", string)
gsub("\\s*\\p{L}*(\\p{L})\\1{2}\\p{L}*", "", string, perl=TRUE)
library(stringr)
str_replace_all(string, "\\s*\\p{L}*(\\p{L})\\1{2}\\p{L}*", "")

全部产生[1] "This is a short word"

请参阅正则表达式演示 正则表达式详细信息

  • \s* - 零个或多个空格
  • \p{L}* / [[:alpha:]]* - 零个或多个字母
  • (\p{L}) - 捕获组 1:任何单个字母
  • \1{2} - 两次出现与第 1 组中相同的值
  • \p{L}* / [[:alpha:]]* - 零个或多个字母。

具有不同正则表达式的 r2evans 示例:

gsub("(\\w)\\1{2, }", "", "aabbbccdddee")
[1] "aaccee"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM