【问题标题】:Why is my regex backreference in R being reversed when I use one backslash with gsub?当我对 gsub 使用一个反斜杠时,为什么我在 R 中的正则表达式反向引用被反转了?
【发布时间】:2017-09-18 21:28:16
【问题描述】:

我不明白为什么我需要使用两个反斜杠来防止反向引用的反转。下面,我详细说明我是如何发现我的问题的:

我想改造一个看起来像这样的角色:

x <- 53/100 000

并将其转换为如下所示:

53/100000

以下是我提出这个问题之前的一些想法:

我认为我可以使用函数gsub 删除出现在/ 字符之后的所有空格。但是,我认为正则表达式解决方案可能更优雅/高效。

起初,我不知道如何在正则表达式中进行反向引用,所以我尝试了这个:

> gsub("/.+\\s",".+",x) [1] "53.+000"

然后我读到您可以使用来自this website\1 反向引用捕获的模式。于是我开始用这个:

> gsub("/.+\\s","\1",x) [1] "53\001000"

然后我意识到反向引用只考虑通配符匹配。但我想保留/ 字符。所以我把它加回去了:

> gsub("/.+\\s","/\1",x) [1] "53/\001000"

然后我尝试了很多其他的东西,但我通过添加一个额外的反斜杠并将我的通配符括在括号中来修复它:

> gsub("/(.+)\\s","/\\1",x) [1] "53/100000"

此外,通过在模式开头插入左括号,我能够从替换中删除 / 字符:

> gsub("(/.+)\\s","\\1",x) [1] "53/100000"

嗯,所以似乎需要两件事:括号和额外的反斜杠。我认为括号是我理解的,因为我相信括号表明您反向引用的文本部分是什么。

我不明白为什么需要两个反斜杠。the reference website 据说只需要\l。这里发生了什么?为什么我的反向引用被反转了?

【问题讨论】:

    标签: r regex gsub backreference


    【解决方案1】:

    额外的反斜杠是必需的,这样 R 在将 "\1" 传递给 gsub 之前不会将其解析为转义字符。 "\\1" 被 gsub 读取为正则表达式 \1。

    【讨论】:

    • 我现在明白了。我一定很不幸,因为 gsub 将“\1”渲染为“\001”,而我的模式是“100”。谢谢你的回答。
    猜你喜欢
    • 2011-03-02
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2012-06-01
    相关资源
    最近更新 更多