R - gsub 和编码问题

R - issue with gsub and encoding

提问人:user3005996 提问时间:8/18/2023 更新时间:8/18/2023 访问量:37

问:

所以。。。我已经在 R 中使用 gsub 将近十年了,我想我刚刚遇到了我见过的最奇怪的问题。

我正在尝试从布鲁克质谱仪 .d 文件中解析该方法(实际上,它是一个包含许多文件的复杂文件夹,其中一些是人类可读的)。方法文件(示例可从 https://wetransfer.com/downloads/c29a29ee8c074d1e8002c3c93cace61320230818104101/b73f0c 下载)是一个 utf-8 编码的 xml 文件。 奇怪的是,这个xml只有几个字段,而实际方法包含在其中一个字段(字段“ModuleMethodData”)中,作为一个很长的字符。该字符实质上是第二个 xml,第一个 xml 中包装了不同的编码:其中,以下字符如下所示:

  • & = &
  • > = >
  • &lt; = <

由于 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("\\&amp;", "&", gsub("\\&gt;", ">", gsub("\\&lt;", "<", lc)))
> lc <- gsub("\\&amp;", "&", gsub("\\&gt;", ">", gsub("\\&lt;", "<", lc))) # For some weird reason I have to do this a second time!!!

我的问题是,当尝试使用 gsub(...) 重新引入 <、> 和 & 时,我必须进行 2 轮,因为第一次只替换了一些目标字符组。我不知道为什么正则表达式最初只与某些实例匹配,但为什么它在第一轮 gsub 之后会捕获相同的实例(可能是对后台发生的编码进行一些无声清理?正则表达式不会重叠或冲突,因此通常我希望在一轮中替换每个正则表达式的所有匹配项。在记事本++中加载文件不会显示任何隐藏字符。

假设其他人可以重现这种奇怪的行为,有没有人知道如何处理这个问题,可能是什么原因?

R XML 编码 嵌套的 gsub

评论

4赞 r2evans 8/18/2023
&amp;这些是“HTML 实体”,可以使用(例如)来自 stackoverflow.com/q/5060076/3358272 的答案以编程方式解码。我无法访问示例数据,它似乎在付费墙后面。请提供我们可以使用的示例数据(或更新链接)。
1赞 r2evans 8/18/2023
我刚刚验证了这两个答案都有效,并且使用 363 个此类实体(freeformatter.com/html-entities.html 中列出的实体)的向量,工作速度提高了 150 倍以上。(当处理具有所有实体的单个字符串时,它们的速度相同,因此在处理字符串向量时会有所改进。unescape_html2unescape_html2
0赞 user3005996 8/19/2023
谢谢!我应该补充一点,我对修复程序并不感兴趣 - 显而易见的答案是实际学习使用运行良好的包 XML - 但是为什么看起来编码不奇怪的字符链的问题(或者如果是,我在 NotePad++ 中看不到它)仍然表现得这样,不同上下文中的相同字符链将被简单的正则表达式匹配或不匹配。
1赞 user3005996 8/19/2023
对于我正确读取嵌套 xml 的原始问题,最直接的答案是使用 XML::xmlToList。惊喜!使用此方法访问嵌套 xml 后,已正确编码(并再次可解析为列表)。有时,初学者养成的坏习惯很难:(
0赞 Parfait 8/19/2023
不应在 X|HTML 上使用正则表达式。使用适当的 DOM 库(如 R 的 XML)来解析内容。请在问题正文中发布XML示例,而不是作为链接,因为未来的读者可能会死掉。

答: 暂无答案