替换包含模式的整个单词 - 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"
根据 OP 评论更新:
试试这个:
gsub("([A-Z]&|[a-z])\1{2, }", "", "AAA")
[1] "AAA"
gsub("([A-Z]&|[a-z])\1{2, }", "", "aabbbccdddee")
[1] "aaccee"
使用不同正则表达式的 r2evans 示例:
gsub("(\w)\1{2, }", "", "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 demo:
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"
.
见regex demo。 正则表达式详细信息:
\s*
- 零个或多个空格
\p{L}*
/ [[:alpha:]]*
- 零个或多个字母
(\p{L})
- 捕获第 1 组:任何单个字母
{2}
- 两次出现与组 1 中相同的值
\p{L}*
/ [[:alpha:]]*
- 零个或多个字母。
我正在尝试清除一些文本中的垃圾。在执行此操作时,我假设任何有一个字母(任何字母)重复三次或更多次的单词都是垃圾 - 我想将其删除。
我想到了这个:
gsub(pattern = "[a-zA-Z]\1\1", replacement = "", string)
其中string
是字符向量,但是这样不行。我尝试过的所有其他方法都可能找到模式,但它只是删除了模式,留下了一团糟。我正在尝试删除带有模式的整个单词。
有什么想法吗?
您需要将“捕获组”分配给 [.]
class,方法是将其包裹在括号中,因为 \1
需要引用一些内容:
gsub("([a-zA-Z])\1\1", "", "aabbbccdddee")
# [1] "aaccee"
根据 OP 评论更新: 试试这个:
gsub("([A-Z]&|[a-z])\1{2, }", "", "AAA")
[1] "AAA"
gsub("([A-Z]&|[a-z])\1{2, }", "", "aabbbccdddee")
[1] "aaccee"
使用不同正则表达式的 r2evans 示例:
gsub("(\w)\1{2, }", "", "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 demo:
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"
.
见regex demo。 正则表达式详细信息:
\s*
- 零个或多个空格\p{L}*
/[[:alpha:]]*
- 零个或多个字母(\p{L})
- 捕获第 1 组:任何单个字母{2}
- 两次出现与组 1 中相同的值
\p{L}*
/[[:alpha:]]*
- 零个或多个字母。