R:如何用* single *反斜杠和空格('\')替换字符串中的空格('')

时间:2016-08-12 02:39:34

标签: regex r replace

我已经多次搜索,但在这里或其他地方找不到答案。我想用包含文件名的变量' '替换每个空格'\ '。 (用例可能是shell命令,空格被转义,因此每个文件名都不会显示为参数列表。)我查看了StackOverflow问题"how to replace single backslash in R",发现许多组合都可以工作正如所宣传的那样:

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

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

但尝试使用单斜杠版本,R忽略它:

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

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

对于相反方向的情况 - 从字符串中删除斜杠,它适用于两个:

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

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

然而,对于单斜线,R中的一些内部反常阻止我甚至试图删除它们:

> gsub("\\", " ", "a\\b")
Error in gsub("\\", " ", "a\\b") : 
  invalid regular expression '\', reason 'Trailing backslash'

> gsub("\", " ", "a\b", fixed = TRUE)
Error: unexpected string constant in "gsub("\", " ", ""

'无效的正则表达式'告诉我们什么,但我看不到什么。 (另请注意,perl = True选项无效。)

即使有三个反斜杠,R也没有注意到一个:

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

模式也延伸了!即使是两个工作的倍数:

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

但不是奇数倍(应该得到'\\\ '

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

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

(我希望有3个斜线,而不是两个。)

我的两个问题是:

  • 我的目标是如何完成用' '替换'\ '的目标?
  • 为什么替换的奇数斜杠变种会失败,而偶数斜杠替换会起作用?

对于shell命令,一个简单的解决方法是引用文件名,但我感兴趣的部分只是想了解R的正则表达式引擎发生了什么。

2 个答案:

答案 0 :(得分:13)

准备面掌,因为:

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

实际上正在运作。

你看到的两个反斜杠只是R控制台显示单个反斜杠的方式,当打印到屏幕时会被转义。

要确认单个反斜杠的替换确实有效,请尝试将输出写入文本文件并检查自己:

f <- file("C:\\output.txt")
writeLines(gsub(" ", "\\", "a b", fixed = TRUE), f)
close(f)

output.txt中,您应该看到以下内容:

a\b

答案 1 :(得分:0)

非常有用的讨论! (我已经搜索了2天了。)

查看差异(而不是写入文件)的另一种方法是使用printcat比较字符串的内容。

z <- gsub(" ", "\\", "a b", fixed = TRUE)

> print(z)
[1] "a\\ b"

> cat(z)
a\ b

因此,通过使用cat而不是print,我们可以确认gsub行已在尝试向字符串中添加单个反斜杠时达到了预期的目的。