【问题标题】:Trouble extracting a string from a character vector从字符向量中提取字符串时遇到问题
【发布时间】:2020-05-25 04:08:54
【问题描述】:

我无法从我使用 stringr 库命名的字符向量中提取某些匹配项:

classes = read_lines("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
  str_flatten()

classes 的小sn-p:

...collaborative data analysis; complete case study review and team data analysis project. 
Effective: 2019 Fall Quarter.</p><h2>STA 190X—Seminar (1-2)</h2><p>Seminar—1-2 hour(s). Prerequisite(s):
STA 013 or STA 013Y or STA 032 or STA 100 or STA 103. In-depth examination of a special topic in a small 
group setting. Effective: 2018 Spring Quarter.</p><h2>STA 192—Internship in Statistics (1-12)</h2>
<p>Internship—3-36 hour(s); Term Paper...

我可以清楚地看到“STA 190X”这个词在我的向量中,但我似乎无法提取它:

>str_detect(classes, "STA 190X")
[1] FALSE

>str_extract_all(classes, "STA 190X")
[[1]]
character(0)

但是如果我将一个部分直接复制并粘贴到函数中,它就可以工作:

> str_detect("</p><h2>STA 190X—Seminar (1-2)</h2>", "STA 190X")
[1] TRUE

> str_extract_all("</p><h2>STA 190X—Seminar (1-2)</h2>", "STA 190X")
[[1]]
[1] "STA 190X"

有人知道这是为什么吗?

【问题讨论】:

  • 您在屏幕上看到的与您的计算机通过read_lines 下载页面时看到的不同(尝试查看源代码或在浏览器中按 Ctrl + U)。右键单击该页面,然后单击检查。建议使用 rvest 包之类的东西再试一次。
  • read_lines from 是哪个包? stringr 不知道。 str(classes) 的输出是什么?
  • @dario str(classes) 的输出是 chr "&lt;!DOCTYPE html&gt;&lt;!--[if IE 8]&gt; &lt;html class=\"lt-ie9\"&gt; &lt;![endif]--&gt;&lt;!--[if gt IE 8]&gt;&lt;!--&gt; &lt;html lang=\"en\" dir="| __truncated__ 。 read_lines 来自 readr 包,它是 tidyverse 的一部分
  • @John 你能检查一下我显示的输出吗

标签: r stringr


【解决方案1】:

我们可以使用rvest 进行处理并提取正确的“节点”

library(rvest)
library(stringr)
library(magrittr)
read_html("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
       html_nodes("h2") %>%
       html_text() %>% 
       str_c(collapse = ' ') %>% 
       str_extract(., "STA 190X")
#[1] "STA 190X"

【讨论】:

  • 我复制了你的代码,但我的输出是“NA”,而不是“STA 190X”
  • @John 抱歉,我无法在 R 3.6.2 上使用 packageVersion('rvest') [1] ‘0.3.4’ &gt; packageVersion('stringr') [1] ‘1.4.0’ 复制它
【解决方案2】:

一个简单的解决方案:

你只需要稍微调整一下你的正则表达式,不仅可以匹配空格,还可以匹配任何不是字母或数字的内容:

str_detect(classes, "STA[^A-z0-9]190X")  
[1] TRUE

解释:

这是最奇怪的事情:

match_position <- gregexpr("STA[^ ]*190X", classes)[[1]][1]
substr(classes, match_position - 10, match_position + 17)

上面的代码返回一个匹配看起来像字符串'STA 190X'但不是的东西。

"r.</p><h2>STA 190X—Seminar ("

不可能,因为STA和190X之间不能有空格。如果一个空格,gregexpr 就不会捕捉到它(STA[^ ]*190X 匹配任何没有在 STA 和 190X 之间有空格的东西)

编辑:

情节变厚了:

grepl("STA[^[:punct:]]*190X", classes)

返回 no 匹配,我认为这意味着神秘角色是以下之一:

[:punct:]

标点符号: ! " # $ % & ' ( ) * + , - . / : ; ?@ [ \ ] ^ _ ` { | } ~.

【讨论】:

    【解决方案3】:

    空格似乎是个问题。尝试将\\s 用于空格,它应该可以工作。

    readr::read_lines("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
        stringr::str_flatten() %>%
        stringr::str_extract("STA\\s190X")
    
    #[1] "STA 190X"
    

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 2015-01-03
      • 2014-11-01
      • 2013-01-10
      • 1970-01-01
      • 2021-09-09
      • 2012-07-22
      相关资源
      最近更新 更多