在R中替换单个反斜杠

44

我有一个长得像这样的字符串:

str<-"a\f\r"

我试图去除反斜杠,但是一切都不起作用:

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

......基本上涵盖了您可以想象到的所有变体。我甚至尝试过string_replace_all函数。有谁能帮助我吗?

我正在使用R 3.1.1版本,Mac OS X 10.7;对于我的字符串向量中的单个字符串,dput的输出如下:

dput(line)
"ud83d\ude21\ud83d\udd2b"

我使用readLines从标准的.txt文件中导入了该文件。该文件的内容大致如下:今天下午找到一位工程师\ud83d\udc4d现在一切都希望解决了\ud83d\ude0a我要发疯了\ud83d\ude21\ud83d\udd2b在utf8towcs中... 谢谢。

3
好的,下面是您需要翻译的内容:相关问题:https://dev59.com/bGgt5IYBdhLWcg3wywhJ - TooTone
1
@maryam str<-"this\is\my\string"无法在R中读取,因为\i\m\s是正则表达式中的保留字,所以你的示例无法重现(并且令人困惑)。你可以将其更改为类似于str <- "a\f\r"的内容。 - David Arenburg
1
@TooTone,看起来刚刚发布了第三个完全相同的答案... - David Arenburg
1
@HongOoi,就像David建议的那样,“a\f\r”,我想做的就是删除这些烦人的单个反斜杠。 - Tavi
1
听起来你的问题实际上不是反斜杠,而是乱码编码。如果R遇到一个它不知道如何打印的字符,你会看到很多反斜杠,代表十六进制代码。请使用dput发布您的代码和数据的实际样本。 - Hong Ooi
显示剩余26条评论
5个回答

20

一个相当通用的解决方案是

gsub("\\\\", "", str)

感谢上面的评论。


2
除了这实际上不起作用:
str <- '\a\f\r' str [1] "\a\f\r" gsub("\\", "", str) [1] "\a\f\r"
- Carl Witthoft

16
键盘输入反斜杠时,请始终对其进行转义。
str <-"this\\is\\my\\string"    # note doubled backslashes -> 'this\is\my\string'
gsub("\\", "", str, fixed=TRUE) # ditto

str2 <- "a\\f\\r"               # ditto -> 'a\f\r'
gsub("\\", "", str2, fixed=TRUE)# ditto

请注意,如果您这样做
str <- "a\f\r"

然后str不包含反斜杠。它由三个字符a\f(通常不可打印,除非作为\f)和\r(相同)组成。
另外,为了避免可能的问题,如果您的数据是从文件中读取的,则文件不必具有双倍反斜杠。例如,如果您有一个名为test.txt的文件,其中包含
a\b\c\d\e\f

而你做

str <- readLines("test.txt")

那么str将包含字符串a\b\c\d\e\f,正如您所期望的那样:6个字母,由5个单反斜杠分隔。但如果要使用它,您仍然需要输入双反斜杠。

str <- gsub("\\", "", str, fixed=TRUE)  # now contains abcdef

根据dput,看起来你手头的是UTF-16编码的文本,很可能来自Windows机器。 它将字形编码在补充多语言平面中,这相当晦涩。我猜想当你读取文件时,需要向readLines提供参数encoding="UTF-16"

2
你是将问题采用到答案中还是我有所遗漏?她的字符串是 str<-"a\f\r",而不是 str <-"this\\is\\my\\string" - David Arenburg
1
原始的代码,在你进行编辑之前,是 str <- "this\is\my\string"。这不是你可以从键盘输入到 R 中的内容。如果它的意思是表示字符串 "this\is\my\string",那么你必须转义反斜杠。 - Hong Ooi
1
实际上我没有将它编辑为 str <- "a\f\r",是 OP 这样做的。错误不是因为反斜杠,而是因为 \i\m\s - David Arenburg
2
如果您将问题调整为答案(就像您所做的那样),它们就可以正常工作。 - David Arenburg
1
我没有修改问题,问题是“如何替换单个反斜杠”。所有的答案都确实做到了这一点;或者说,在人们试图替换不存在的反斜杠之前,他们确实做到了这一点。我无法恢复一个答案,但如果martin和tootone愿意,他们可以自由地恢复。 - Hong Ooi
显示剩余14条评论

13

由于没有直接处理单个反斜杠的方法,因此这里提供了David Arenburg在评论部分提供的最接近问题的解决方案。

gsub("[^A-Za-z0-9]", "", str) #remove all besides the alphabets & numbers

4
这不是一个好的解决方案,因为它也会移除空格。更好的方法是使用 gsub("\\", "", str)。 - Adrian
3
在排除的字符中添加一个空格:gsub("[^A-Za-z0-9 ]", "", str) - Peter Prevos

10

这可能会有帮助 :)

require(stringi)
stri_escape_unicode("ala\\ma\\kota")
## [1] "ala\\\\ma\\\\kota"
stri_unescape_unicode("ala\\ ma\\ kota")
## [1] "ala ma kota"

4

从 R 4.0.0 开始,您现在可以使用原始字符串来避免反斜杠的混淆,只需使用以下语法:r"(您的原始表达式)"(包括括号):

str<-r"(ud83d\ude21\ud83d\udd2b)" #Equivalent of "ud83d\\ude21\\ud83d\\udd2b"
gsub(r"(\\)", "", str)
# [1] "ud83dude21ud83dudd2b"

2
这里唯一的问题是:如果我有一个字符串 mystring <- 'ud83d\ud21'。我无法将其插入到 r"( 构造中,因为在其中没有任何内容被解释。 - Carl Witthoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接