替换 R 中的单个反斜杠
Posted
技术标签:
【中文标题】替换 R 中的单个反斜杠【英文标题】:Replace single backslash in R 【发布时间】:2014-10-14 23:19:16 【问题描述】:我有一个看起来像这样的字符串:
str<-"a\f\r"
我正在尝试删除反斜杠,但没有任何效果:
gsub("\","",str, fixed=TRUE)
gsub("\\","",str)
gsub("(\)","",str)
gsub("([\])","",str)
...基本上所有你能想象到的变化。我什至尝试过string_replace_all
函数。有什么帮助吗??
我使用的是 R 版本 3.1.1; Mac OSX 10.7;我的字符串向量中单个字符串的dput
给出:
dput(line)
"ud83d\ude21\ud83d\udd2b"
我使用
readLines
来自标准
.txt
文件。该文件的内容类似于:
got an engineer booked for this afternoon \ud83d\udc4d all now hopefully sorted\ud83d\ude0a I m going to go insane ud83d\ude21\ud83d\udd2b in utf8towcs …
谢谢。
【问题讨论】:
相关***.com/questions/11806501/backslash-in-r-string @maryamstr<-"this\is\my\string"
无法读入 R,因为 \i
、\m
和 \s
是存储在正则表达式中的字母,因此您的示例不可重现(且令人困惑)。你可以把它改成str <- "a\f\r"
@TooTone,似乎第三个完全相同的答案刚刚发布...
@HongOoi 就像大卫建议的 "a\f\r" 我想要做的就是删除该死的单反斜杠
听起来您的问题实际上不是反斜杠,而是错误的文本编码。如果 R 遇到一个它不知道如何打印的字符,您会在该位置看到很多反斜杠,代表十六进制代码。使用dput
发布代码和数据的实际示例。
【参考方案1】:
一个非常通用的解决方案是
gsub("\\\\", "", str)
感谢上面的评论。
【讨论】:
除非这实际上不起作用:> str <- '\a\f\r' > str [1] "\a\f\r" > gsub("\\\\", "", str) [1] "\a\f\r"
【参考方案2】:
从键盘输入反斜杠时,请始终将其转义。
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
包含no 反斜杠。它由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 机器。根据
它对Supplementary Multilingual Plane 中的字形进行编码,这非常晦涩难懂。我猜您在读取文件时需要将参数encoding="UTF-16"
提供给readLines
。
【讨论】:
您是刚刚采纳了这个问题,还是我遗漏了什么?她有str<-"a\f\r"
字符串,而不是str <-"this\\is\\my\\string"
在您进行编辑之前,原始版本是 str <- "this\is\my\string"
。这不是您可以从键盘输入 R 的内容。如果它旨在表示字符串 "this\is\my\string"
,则必须转义反斜杠。
其实我没有把它编辑到str <- "a\f\r"
,OP 做到了。错误不是因为反斜杠而是因为\i
、\m
和\s
没错,但这是您的建议。
如果您将问题调整为答案(就像您所做的那样),它们会正常工作,是的。【参考方案3】:
由于没有任何直接的方法来处理单个反斜杠,因此这是 David Arenburg 在 cmets 部分中提供的最接近该问题的解决方案
gsub("[^A-Za-z0-9]", "", str) #remove all besides the alphabets & numbers
【讨论】:
这不是一个好的解决方案,因为它也会删除空格。更好的是 gsub("\\\\", "", str) 为排除的字符添加空格:gsub("[^A-Za-z0-9 ]", "", str)
【参考方案4】:
这可能会有所帮助:)
require(stringi)
stri_escape_unicode("ala\\ma\\kota")
## [1] "ala\\\\ma\\\\kota"
stri_unescape_unicode("ala\\ ma\\ kota")
## [1] "ala ma kota"
【讨论】:
【参考方案5】:从 R 4.0.0 开始,您现在可以使用原始字符串以避免与反斜杠混淆,只需使用以下语法:r"(your_raw_expression)"
(包括括号):
str<-r"(ud83d\ude21\ud83d\udd2b)" #Equivalent of "ud83d\\ude21\\ud83d\\udd2b"
gsub(r"(\\)", "", str)
# [1] "ud83dude21ud83dudd2b"
【讨论】:
这里唯一的问题是:如果我有一个字符串mystring <- 'ud83d\ud21'
怎么办。我不能在 r"(
构造中插入它,因为里面没有任何东西被解释。以上是关于替换 R 中的单个反斜杠的主要内容,如果未能解决你的问题,请参考以下文章