如何使用R中的gsub用单个反斜杠替换字符串?

时间:2017-03-24 07:56:26

标签: r regex string

我喜欢编码UTF-8字符串。在我的数据中,字符与=分隔为R中的函数encoding我需要将它们与\x

分开
string <- "=2E=30=31=20=52=C3=A9=70=6F=6E=64=65=75=72"
x <-  gsub("=", "\x", string)
Encoding(x)
Encoding(x) <- "latin1"
x

我试图添加一个,两个,三个反斜杠来逃避。放入圆形和方括号。添加引号。放置参数fixed=F。阅读hereherehere,但仍然不知道如何操作。

预期输出:

.01 Répondeur

当我使用两个反斜杠时,例如Wiktor说并检查cat(),输出中只有一个反斜杠,但它对encoding()没有影响,只有当我改变它时手。

修改

例如,当我这样做时,它会放两个反斜杠而endcoding不起作用:

> gsub("=", "\\x", string, fixed=TRUE)
[1] "\\x2E\\x30\\x31\\x20\\x52\\xC3\\xA9\\x70\\x6F\\x6E\\x64\\x65\\x75\\x72"

与亚历山大·沃伊托夫的建议相同:

> gsub("=", "\\\\x", string)
[1] "\\x2E\\x30\\x31\\x20\\x52\\xC3\\xA9\\x70\\x6F\\x6E\\x64\\x65\\x75\\x72"

3 个答案:

答案 0 :(得分:2)

x <- "=2E=30=31=20=52=C3=A9=70=6F=6E=64=65=75=72"  # string data
x <- strsplit(x, "=", useBytes = FALSE )[[1]]       # split string
x <- x[nchar(x) > 0]                               # remove elements with 0 character length

使用strtoi

# convert string to integer and convert integer to raw and then to character
rawToChar( as.raw( strtoi(x, base = 16L) ) )                  
# [1] ".01 Répondeur"

?strtoi文档页面说

  

十六进制常量(前缀0x或0X)被解释为基数8和   16

使用as.hexmode将字符转换为十六进制格式

rawToChar( as.raw( as.hexmode( x ) ) )
# [1] ".01 Répondeur"

答案 1 :(得分:2)

您可以使用gsub("=", "\\x", string, fixed=TRUE)=替换为\x,然后parse生成的字符串:

string <- "=2E=30=31=20=52=C3=A9=70=6F=6E=64=65=75=72"
x <- parse(text = paste0("'", gsub("=", "\\x", string, fixed=TRUE), "'"))
x[[1]]
## => ".01 Répondeur"

请参阅online R demo

以下是基于Unicode package的另一种解决方案:

> library(Unicode)
> string <- "=2E=30=31=20=52=C3=A9=70=6F=6E=64=65=75=72"
> x1 <- gsub("=", " U+", string, fixed=TRUE)
> y <- unlist(strsplit(trimws(x1), "\\s+"))
> intToUtf8(as.u_char_seq(y))
[1] ".01 Répondeur"

在这里,我用空格+ =替换了所有U+,然后在修剪输入后用1 +空白符号拆分字符串。 intToUtf8(as.u_char_seq(y))从Unicode字符序列创建Unicode字符串。

答案 2 :(得分:1)

string <- "=2E=30=31=20=52=C3=A9=70=6F=6E=64=65=75=72"
x <-  gsub("=", "\\\\x ", string)