【问题标题】:Regular expressions remove everything between <>正则表达式删除 <> 之间的所有内容
【发布时间】:2017-04-19 19:01:57
【问题描述】:

我正在学习网络抓取。我掌握了一堆数据,但结构混乱。
我有一个这种形式的字符串向量:
"9,55&lt; U+00A0&gt;x&lt; U+00A0&gt;1016",(现在当我写它时,我认为这是一种特殊的语法,因为如果不在“U”之前放置一个空格,我就无法将它粘贴到这里) 在我正在抓取的网站上写为“9,55*10^16”。

从长远来看,我的目标是将这个字符串变成一个数字变量,即 95500000000000000。 但首先我想删除第一个“”之间的所有内容。 以下是我的尝试。

gsub("<(.*?)>", "", vectorOfStrings)

编辑:最好在 R 中使用"9,55\U{00A0}x\U{00A0}1016" 生成字符串,因为“”不是字符串中的实际文字。

【问题讨论】:

  • 这是什么语言?什么是 gsub()?
  • @MrJLP:它是“R”语言。 gsub 是正则表达式搜索/替换函数。
  • 如果你使用 php 做 preg_replace javascript 做 //g 需要注意的是,有时他们不做 但 <和>也许对于 R 语言你需要做 //g
  • 这是R programming language,不是 PHP。
  • 所以试试 gsub("//g", "", vecorOfSrings) //g 代表全局

标签: r regex web-scraping gsub


【解决方案1】:

您看到的字符是 unicode(我认为是 UTF-8),而 R 的表示(当它不是很清楚时)是小于/大于符号。要删除它,一种方法是将文本“转换”为 ASCII:

iconv(vectorOfStrings, "utf-8", "ASCII", sub = "")

任何不可翻译的东西都应该被删除。

【讨论】:

  • 是的,就是这样! :D 我在想是这样的,因为我无法在我的问题中以正确的形式写出来。所以自动将其转换为“正确”的结构。谢谢!
【解决方案2】:

我会简单地将您贪婪的“匹配所有”更改为“匹配除 '>' 之外的所有内容,或者使用 .? 使其变得懒惰(匹配最少)

<[^>]*> or <.*?>

或将标签与标签匹配

<.*?>.*?<.*?>

【讨论】:

  • 如果它只是一个普通字符串就可以了,但在我的情况下它是不同的:(请参阅@r2evans 解决方案。
  • @TKN 我会把它放在包里,有人来这里根据问题标题寻找文本版本 =P
【解决方案3】:

这行得通

>vectorOfStrings = "9,55< U+00A0>x< U+00A0>1016"
>vectorOfStrings1 = gsub("<[^>]+>","",vectorOfStrings)
>vectorOfStrings1 
[1] "9,55x1016"

【讨论】:

  • 如果它只是一个普通字符串就可以了,但在我的情况下它是不同的:(请参阅@r2evans 解决方案。
【解决方案4】:

这是我从网络上将科学记数法数字刮成数字的代码:

library(magrittr)

vectorOfStrings <- "9,55< U+00A0>x< U+00A0>1016"  

scrape_numeric <- function(x) {
 x %>% 
   gsub(">10", ">e+", .) %>%
   gsub("<.*>", "", .) %>%
   gsub(",", ".", .) %>%
   as.numeric
}

scrape_numeric(vectorOfStrings)

# [1] 9.55e+16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2010-10-16
    • 2018-05-26
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多