替换 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 @maryam str&lt;-"this\is\my\string" 无法读入 R,因为 \i\m\s 是存储在正则表达式中的字母,因此您的示例不可重现(且令人困惑)。你可以把它改成str &lt;- "a\f\r" @TooTone,似乎第三个完全相同的答案刚刚发布... @HongOoi 就像大卫建议的 "a\f\r" 我想要做的就是删除该死的单反斜杠 听起来您的问题实际上不是反斜杠,而是错误的文本编码。如果 R 遇到一个它不知道如何打印的字符,您会在该位置看到很多反斜杠,代表十六进制代码。使用dput 发布代码和数据的实际示例。 【参考方案1】:

一个非常通用的解决方案是

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

感谢上面的评论。

【讨论】:

除非这实际上不起作用:&gt; str &lt;- '\a\f\r' &gt; str [1] "\a\f\r" &gt; 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 机器。根据

https://en.wikipedia.org/wiki/Unicode#Character_General_Category https://en.wikipedia.org/wiki/UTF-16

它对Supplementary Multilingual Plane 中的字形进行编码,这非常晦涩难懂。我猜您在读取文件时需要将参数encoding="UTF-16" 提供给readLines

【讨论】:

您是刚刚采纳了这个问题,还是我遗漏了什么?她有str&lt;-"a\f\r" 字符串,而不是str &lt;-"this\\is\\my\\string" 在您进行编辑之前,原始版本是 str &lt;- "this\is\my\string"。这不是您可以从键盘输入 R 的内容。如果它旨在表示字符串 "this\is\my\string",则必须转义反斜杠。 其实我没有把它编辑到str &lt;- "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 &lt;- 'ud83d\ud21' 怎么办。我不能在 r"( 构造中插入它,因为里面没有任何东西被解释。

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

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

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

Ruby gsub 替换值的单反斜杠?

为啥 Python 的原始字符串文字不能以单个反斜杠结尾?

正则表达式替换文本,除非它前面有反斜杠而不使用后视

删除C#变体中的单个反斜杠