【问题标题】:R: strsplit on backslash (\)R:反斜杠上的 strsplit (\)
【发布时间】:2016-01-17 13:20:36
【问题描述】:

我试图在第一个反斜杠之前提取字符串的一部分,但我似乎无法让它正常工作。

根据 strsplit 的手册页和在线搜索后,我尝试了多种让它工作的方法。

在我的实际情况中,字符串位于我从数据库连接获取的数据框中,但我可以通过以下方式简化情况:

> strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","\\",fixed=TRUE) [[1]] [1] "BLAAT1\022E:" "BLAAT2" "BLAAT3" > strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","\\",fixed=FALSE) strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3", "\\", fixed = FALSE) 中的错误: 无效的正则表达式“\”,原因是“尾随反斜杠” > strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","\\\\",fixed=TRUE) [[1]] [1] "BLAAT1\022E:\\BLAAT2\\BLAAT3" > strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","\\\\",fixed=FALSE) [[1]] [1] "BLAAT1\022E:" "BLAAT2" "BLAAT3"

预期的输出也会在 BLAAT1 和 022E 之间的 \ 上拆分:

提前致谢

【问题讨论】:

  • 您想要 4 个元素作为预期输出,还是仅将 BLAAT02E:\\BLATT2\\BLAAT3 作为第二个拆分。顺便说一句,\022 这是一个 unicode 符号
  • 你这里有ASCII字符,strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","[[:cntrl:]]")给你想要的吗?
  • "\022" 是一个字符。
  • strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","[^[:print:]]")

标签: regex r strsplit


【解决方案1】:

如果您使用带有strsplit 函数的正则表达式,则文字反斜杠可以编码为两个文字反斜杠(因为文字\ 是一个特殊的正则表达式元字符,用于形成正则表达式转义,例如\d、@ 987654326@ 等),但由于 R 字符串文字支持字符串转义序列(例如 "\r" 用于回车,"\n" 用于换行符),因此需要使用双反斜杠定义文字反斜杠。

所以,"\\" 是一个文字 \,一个正则表达式模式来匹配一个文字反斜杠字符,即 \\,应该用 4 个反斜杠编码,"\\\\"

这是一个您可以使用的正则表达式:它在 \non-printable character 处拆分:

strsplit("BLAAT1\022E:\\BLAAT2\\BLAAT3","\\\\|[^[:print:]]",fixed=FALSE)
# [1] "BLAAT1" "E:"     "BLAAT2" "BLAAT3"

IDEONE demo

【讨论】:

  • 谢谢,没有意识到 \022 是一个不可打印的字符。
猜你喜欢
  • 2017-07-25
  • 2020-01-17
  • 2015-02-14
  • 1970-01-01
  • 2021-12-25
  • 2023-02-07
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多