我想用空格替换字符串中的所有单个字符。我的想法是在单个角色之前和之后应该有一个空格。所以我在角色之前和之后放置了空格,但这似乎不起作用。我还想用超过1个字符替换字符串。即如果我想替换长度为2左右的所有字符,那么代码将如何变化。
str="I have a cat of white color"
str=gsub("([[:space:]][[a-z]][[:space:]])", "", str)
答案 0 :(得分:2)
我想用空格替换字符串中的所有单个字符。我的想法是在单个角色之前和之后应该有一个空格。
这个想法不正确,一个词并不总是被空格包围。如果单词位于字符串的开头怎么办?还是在最后?或者之后是标点符号?
使用 \b
word boundary :
有三个不同的职位符合字边界 :
- 在字符串中的第一个字符之前,如果第一个字符是单词字符 - 在字符串中的最后一个字符之后,如果最后一个字符是单词字符 - 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
注意在R中,当您使用gsub
时,最好将其与PCRE正则表达式一起使用(通过perl=T
):
gsub
和gregexpr
的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)
是一个不区分大小写的修饰符(a
与a
和A
匹配。
现在,您需要匹配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}
将字母a
与z
两次匹配。你想要的正则表达式是这样的:
\\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"