R - gsub 替换反斜杠

Posted

技术标签:

【中文标题】R - gsub 替换反斜杠【英文标题】:R - gsub replacing backslashes 【发布时间】:2015-02-14 00:25:36 【问题描述】:

我想使用 gsub 将字符串中出现的每个反斜杠替换为 2 个反斜杠。

目前,我尝试的是gsub("\\\\", "\\", x)。这似乎不起作用。但是,如果我将表达式更改为将每个反斜杠替换为“a”,它就可以正常工作。

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

最后一个字符只有一个反斜杠; R 只打印 2 因为它使用反斜杠打印转义字符。使用nchar 确认长度为1。

是什么导致了这个功能? gsub 的第二个参数不是正则表达式,因此字符串文字中的 4 个反斜杠应转换为具有 2 个反斜杠的字符。上面的第一个 gsub 调用返回一个空字符串就更没有意义了。

【问题讨论】:

我认为您对参数顺序感到困惑。第一个参数是您要查找的参数。所以如果你想用两个替换每个斜线,你不想要:gsub("\\\\", "\\\\\\\\", x)?此外,如果您使用cat() 值而不是使用默认的隐式print(),则看不到斜线的转义部分。 另见here 【参考方案1】:

这是你需要的:

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

您需要四个反斜杠来表示一个文字反斜杠的原因是"\" 在 R 字符串和您最终将模式传递到的正则表达式引擎中都是一个转义字符。如果您直接与正则表达式引擎对话,您将使用 "\\" 来指示文字反斜杠。但是为了让 R 将"\\" 传递给正则表达式引擎,您需要输入"\\\\"


(如果你只是想要双反斜杠,你可能想用这个代替):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"

【讨论】:

是的,我通过反复试验发现了这一点。我想知道为什么会发生上述行为。第二个参数不是正则表达式,因此结果应该只与第二个参数的长度相同。在该示例中,第二个参数长度为 4 个字符,但结果仅为 2。 第二个参数可能不是正则表达式,但 "\" 反斜杠仍被解释为其中的转义字符。在这样的调用的第二个参数中使用它:gsub("([[:digit:]]*)\\s*([[:alpha:]]*)", "\\2---->\\1", "101 trombones") 我很惊讶它在我的第一个示例中没有抱怨,因为第二个参数中有一个转义字符而没有其他任何内容。我知道对正则表达式做同样的事情,例如在第一个参数中,将在尾部反斜杠上抛出错误。 @JonClaus 同意。这对我来说是个谜。

以上是关于R - gsub 替换反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

Ruby gsub 替换值的单反斜杠?

如何将反斜杠替换为字符串Python中的不同字符

shell脚本如何把反斜杠替换成斜杠反斜杠,比如2014\/5\/10变成2014/5/10,急用谢谢!

用正斜杠“/”动态替换反斜杠“\”[重复]

如何用反斜杠替换正斜杠

目标 C:用单反斜杠替换双反斜杠