【问题标题】:How to replace many special characters with "something plus special characters" in R如何在R中用“加上特殊字符”替换许多特殊字符
【发布时间】:2015-06-10 09:23:52
【问题描述】:

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

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

【问题讨论】:

    标签: regex r string replace


    【解决方案1】:

    您可以使用捕获组引用:

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

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

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

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

    【讨论】:

    • 如果事先不知道特殊字符(比如用punct),有没有办法概括这一点
    • gsub("([[:punct:]])", " \\1 ", x) ...虽然这会弄乱句号等
    • @user20650 绝对,只需使用所需的正则表达式集。
    • 非常感谢您的解释。我不知道 "\\1" 把戏。
    【解决方案2】:

    好像是这个意思,

    > 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:]

    【讨论】:

    • 两者都是很好的答案。我将 BrodieG 的答案标记为“正确”答案只是因为他解释得更详细。谢谢你们!
    • @wen 不是将每个单个字符添加到列表中,为什么没有一个简单的正则表达式来匹配所有特殊字符?
    【解决方案3】:

    您可以在 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

    【讨论】:

    • 对不起,我误解了你的意思。将在体内澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多