如何在 R 中用 "something plus special characters" 替换许多特殊字符

How to replace many special characters with "something plus special characters" in R

我有这句话包含“& / ?”。

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:] 作为第二个参数。

您可以使用捕获组参考:

gsub("([&/])", " \1 ", c)

这里我们将"&""/"替换为自己("\1")并用空格填充。 "\1" 表示“使用模式中的第一个匹配组。匹配组是括号中正则表达式的一部分。在我们的例子中,"([&/])".

您可以通过将符号/特殊字符添加到字符集中或放入适当的正则表达式特殊字符来扩展它以涵盖更多符号/特殊字符。

注意:您可能不应该使用 c 作为变量名,因为它也是一个非常常用的函数的名称。

看来你是这个意思,

> c <- "Do Sam&Lilly like yes/no questions?"
> gsub("([^[:alnum:][:blank:]])", " \1 ", c)
[1] "Do Sam & Lilly like yes / no questions ? "

[^[:alnum:][:blank:]] 否定 POSIX 字符 class 匹配任何字符,但不匹配字母数字或水平 space 字符。通过将模式放入捕获组中,它将捕获所有特殊字符。用 space+\1 替换匹配的特殊字符( 指的是第一组中存在的字符 )+ space 会给你想要的输出。您也可以使用 [:space:] 而不是 [:blank:]

您可以在 gsub 之外构建您的正则表达式模式,然后将它们传入。我看到 BrodieG 重新释放到 "(...)" 中包含的模式作为 "capture group"。方括号 "[...]" 内的 material 在 ?regex 的 R-帮助页面中称为 "character classes"。 "\1" 是一个 "back-reference" 并且由于正则表达式帮助页面似乎对如何调用括号中的字符串的问题保持沉默,我可能只是在理解方面被推得更远了正则表达式术语。 :

your_chars <- c("!@#$%^&*", "()_+", "?/")
patt <- paste0( "([", paste0(your_chars,collapse=""), "])", collapse="")
gsub(patt, " \1 ", ct)
#[1] "Do Sam & Lilly like yes / no questions ? "

如果你想在一个字符值中替换多个实例,你需要使用 gsub 而不是 sub