如何替换字符串中的单个/双字符

时间:2016-03-02 05:11:48

标签: regex r string gsub

我想用空格替换字符串中的所有单个字符。我的想法是在单个角色之前和之后应该有一个空格。所以我在角色之前和之后放置了空格,但这似乎不起作用。我还想用超过1个字符替换字符串。即如果我想替换长度为2左右的所有字符,那么代码将如何变化。

str="I have a cat of white color"
str=gsub("([[:space:]][[a-z]][[:space:]])", "", str)

2 个答案:

答案 0 :(得分:2)

  

我想用空格替换字符串中的所有单个字符。我的想法是在单个角色之前和之后应该有一个空格。

这个想法不正确,一个词并不总是被空格包围。如果单词位于字符串的开头怎么办?还是在最后?或者之后是标点符号?

使用 \b word boundary

  

有三个不同的职位符合字边界 :   
    - 在字符串中的第一个字符之前,如果第一个字符是单词字符     - 在字符串中的最后一个字符之后,如果最后一个字符是单词字符     - 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

注意在R中,当您使用gsub时,最好将其与PCRE正则表达式一起使用(通过perl=T):

  

gsubgregexpr的POSIX 1003.2模式无法正常使用重复的字边界(例如pattern = "\b")。使用perl = TRUE进行此类匹配(但对于非ASCII输入可能无法正常工作,因为'word'的含义取决于系统)。

因此,要匹配所有单字母单词,您需要使用

gsub("(?i)\\b[a-z]\\b", "REPLACEMENT", input, perl=T) ## To replace 1 ASCII letter words

请注意,(?i)是一个不区分大小写的修饰符(aaA匹配。

现在,您需要匹配2个字母的单词:

gsub("(?i)\\b[a-z]{2}\\b", "REPLACEMENT", input, perl=T) ## To replace 2 ASCII letter words

在这里,我们使用limiting quantifier {min, max} / {max}来指定可以重复使用此构造量化的模式的次数。

请参阅IDEONE demo

> input = "I am a football fan"
> gsub("(?i)\\b[a-z]\\b", "REPLACEMENT", input, perl=T) ## To replace 1 ASCII letter words
[1] "REPLACEMENT am REPLACEMENT football fan"
gsub("(?i)\\b[a-z]{2}\\b", "REPLACEMENT", input, perl=T) ## To replace 2 ASCII letter words
[1] "I REPLACEMENT a football fan"

答案 1 :(得分:1)

您需要使用量词正则表达式属性,例如[a-z]{2}将字母az两次匹配。你想要的正则表达式是这样的:

\\s[a-z]{2}\\s

您可以使用输入的字符数在R中动态构建此正则表达式。这是一个代码片段,用于演示:

str <- "I have a cat of white color"
nchars <- 2
exp <- paste0("\\s[a-z]{", nchars, "}\\s")

> gsub(exp, "", str)
[1] "I have a catwhite color"