我有这句话包含"& /?"。
c = "Do Sam&Lilly like yes/no questions?"
我想在每个特殊字符之前和之后添加一个空格来获取
"Do Sam & Lilly like yes / no questions ? "
我只能通过艰难的方式解决这个问题:
c = gsub("[&]", " & ", c)
c = gsub("[/]", " / ", c)
c = gsub("[?]", " ? ", c)
但想象一下,我有许多这些特殊角色,保证使用[:alnum:]。所以我真的在寻找一个看起来像这样的解决方案:
gsub("[[:alnum:]]", " [[:alnum:]] ", c)
不幸的是,我不能用[:alnum:]作为第二个参数。
答案 0 :(得分:5)
您可以使用捕获组参考:
gsub("([&/])", " \\1 ", c)
我们将"&"
或"/"
替换为自己("\\1"
)填充空格。 "\\1"
表示“使用模式中的第一个匹配组。匹配的组是括号中正则表达式的一部分。在我们的示例中,"([&/])"
。
您可以通过将其添加到字符集中,或通过添加适当的正则表达式特殊字符来扩展它以覆盖更多符号/特殊字符。
注意:您可能不应该使用c
作为变量名称,因为它也是一个非常常用的函数的名称。
答案 1 :(得分:3)
好像你的意思是这个,
> c <- "Do Sam&Lilly like yes/no questions?"
> gsub("([^[:alnum:][:blank:]])", " \\1 ", c)
[1] "Do Sam & Lilly like yes / no questions ? "
[^[:alnum:][:blank:]]
否定了POSIX字符类,它匹配任何字符但不包含字母数字或水平空格字符。通过将模式放在捕获组中,它将捕获所有特殊字符。将匹配的特殊字符替换为space
+ \\1
(指的是第一组中存在的字符)+ space
将为您提供所需的输出。您也可以使用[:space:]
代替[:blank:]
。
答案 2 :(得分:0)
您可以在gsub
之外构建正则表达式模式,然后将其传入。我看到BrodieG拒绝将"(...)"
中包含的模式作为“捕获组”。方括号"[...]"
内的材料在?regex
的R帮助页面中称为“字符类”。 “\ 1”是一个“反向引用”,因为正则表达式帮助页面似乎对括号中括起来的字符串的问题保持沉默,所以我可能只是在我对正则表达式术语。 :
your_chars <- c("!@#$%^&*", "()_+", "?/")
patt <- paste0( "([", paste0(your_chars,collapse=""), "])", collapse="")
gsub(patt, " \\1 ", ct)
#[1] "Do Sam & Lilly like yes / no questions ? "
如果要在字符值中替换多个实例,则需要使用gsub
而不是sub
。