提问人:user3005996 提问时间:8/18/2023 更新时间:8/18/2023 访问量:37
R - gsub 和编码问题
R - issue with gsub and encoding
问:
所以。。。我已经在 R 中使用 gsub 将近十年了,我想我刚刚遇到了我见过的最奇怪的问题。
我正在尝试从布鲁克质谱仪 .d 文件中解析该方法(实际上,它是一个包含许多文件的复杂文件夹,其中一些是人类可读的)。方法文件(示例可从 https://wetransfer.com/downloads/c29a29ee8c074d1e8002c3c93cace61320230818104101/b73f0c 下载)是一个 utf-8 编码的 xml 文件。 奇怪的是,这个xml只有几个字段,而实际方法包含在其中一个字段(字段“ModuleMethodData”)中,作为一个很长的字符。该字符实质上是第二个 xml,第一个 xml 中包装了不同的编码:其中,以下字符如下所示:
&
=&
>
=>
<
=<
由于 a) 我对 xml 知之甚少,b) xml 的结构将遵循非常具体、可预测的模式,以及 c) 过去使用类似的 xml 时,我总是需要非常有限和精确的信息,我可以用正则表达式快速捞出这些信息,我的第一次尝试是捞出嵌套的 xml,然后使用 grep 和 gsub 解析它。但是,这样做我遇到了一个意想不到的困难:
> fl <- ... # path to hystar.method file
> meth <- readLines(fl)
> inst <- gsub(" *</?DeviceName> *", "", grep("<DeviceName>", meth, value = TRUE)) # Get nested xml
> lc <- gsub(" *</?ModuleMethodData[^>]+> *", "", grep("<ModuleMethodData[^>]+>", meth, value = TRUE))
> lc <- gsub("\\&", "&", gsub("\\>", ">", gsub("\\<", "<", lc)))
> lc <- gsub("\\&", "&", gsub("\\>", ">", gsub("\\<", "<", lc))) # For some weird reason I have to do this a second time!!!
我的问题是,当尝试使用 gsub(...) 重新引入 <、> 和 & 时,我必须进行 2 轮,因为第一次只替换了一些目标字符组。我不知道为什么正则表达式最初只与某些实例匹配,但为什么它在第一轮 gsub 之后会捕获相同的实例(可能是对后台发生的编码进行一些无声清理?正则表达式不会重叠或冲突,因此通常我希望在一轮中替换每个正则表达式的所有匹配项。在记事本++中加载文件不会显示任何隐藏字符。
假设其他人可以重现这种奇怪的行为,有没有人知道如何处理这个问题,可能是什么原因?
答: 暂无答案
评论
&
这些是“HTML 实体”,可以使用(例如)来自 stackoverflow.com/q/5060076/3358272 的答案以编程方式解码。我无法访问示例数据,它似乎在付费墙后面。请提供我们可以使用的示例数据(或更新链接)。unescape_html2
unescape_html2