【问题标题】:Extract id values within quotation marks "" in R在R中的引号“”内提取id值
【发布时间】:2016-03-16 14:02:05
【问题描述】:

我有以下数据(XML/OSM 文件提取):

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Osmosis 0.44.1">
  <node id="3569633" version="1" timestamp="2016-03-02T22:09:35Z">
    <tag k="housenumber" v="8"/>
    <tag k="street" v="Test Street"/>
  </node>
  <relation id="3571336" version="1" timestamp="2016-03-02T22:09:35Z">
    <member type="way" ref="3571337" role="outer"/>
    <tag k="type" v="boundary"/>
    <tag k="admin_level" v="8"/>
    <tag k="boundary" v="administrative"/>
  </relation>
 <way id="3536236" version="1" timestamp="2016-03-02T22:09:35Z">
    <nd ref="3536237"/>
    <nd ref="3536238"/>
    <nd ref="3536239"/>
    <nd ref="3536240"/>
    <nd ref="3536241"/>
 </way>
</osm>

我现在要做的是提取 id 号码,所以在这种情况下:

3569633
3571336
3536236

并将其保存为向量,以便我可以对其使用 max() 函数。

我对任何(“快速”)R 解决方案持开放态度。我尝试使用 xml 包但没有成功,因为我的 Xpath 知识太基础了。我也想过使用正则表达式,但在这里,我也想念这些知识。 当使用能够应用正则表达式的文本编辑器时,我得到了以下表达式:

id="(\d+)" 

但这会标记所有:

id="3569633"

部分。如果我可以调整它以找到引号之间的值。我可以使用readLines() 函数,也许还可以使用grep()

任何帮助将不胜感激。

另外还可以提取ref="" 部分的数字,以便最终向量包含以下值:

3569633
3571336
3536236
3536237
3536238
3536239
3536240
3536241

【问题讨论】:

  • 您可以通过//*/@refid//*/@id 轻松获取ref 属性值。请发布您尝试过的 XML 代码。
  • 使用this,您可以选择使用$2 的组。使用this,您可以使用积极的后视。

标签: regex xml r


【解决方案1】:

虽然我不鼓励使用正则表达式来解析 XML 和 HTML 内容。

对于这种特殊情况,您只需像这样使用look around 断言。

正则表达式: (?&lt;=id="|ref=")\d+(?=")

说明:

  • (?&lt;=id="|ref=") 将向后查找 idref 部分。

  • \d+ 将匹配您的号码。而(?=") 将提前查找结束引号。

Regex101 Demo

【讨论】:

    【解决方案2】:

    您可以使用非常基本的 XPath 使用 XML 包轻松获得所需的内容:

    > library(XML)
    > url = "PATH_TO_XML_FILE"
    > parsed_doc = htmlParse(file=url, useInternalNodes = TRUE)
    > attrs <- getNodeSet(doc = parsed_doc, path = "//*[@id or @ref]")
    > ids <- sapply(attrs, xmlGetAttr, "id") 
    > refs <- sapply(attrs, xmlGetAttr, "ref")
    > res <- mapply(c, ids, refs, SIMPLIFY=FALSE)
    > unlist(res)
    [1] "3569633" "3571336" "3571337" "3536236" "3536237" "3536238" "3536239" "3536240" "3536241"
    

    //*[@id or @ref] XPath 表达式将获取所有具有idref 属性的节点。使用sapply(attrs, xmlGetAttr, "id"),您将获得id 属性的值。以类似的方式,您可以获取ref 属性值并将它们附加到现有的id 属性列表中,然后您可以将两个列表与mapply(c, ids, refs, SIMPLIFY=FALSE) 合并。

    【讨论】:

      【解决方案3】:

      如果你只想要 nd @refs,试试

      doc <- xmlParse('your XML above')
      #xpathSApply(doc, "//@id|//@ref")
       xpathSApply(doc, "//@id|//nd/@ref")
             id        id        id       ref       ref       ref       ref       ref 
      "3569633" "3571336" "3536236" "3536237" "3536238" "3536239" "3536240" "3536241" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-25
        • 2012-01-26
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-05
        • 1970-01-01
        相关资源
        最近更新 更多