1
votes

Problème lors de l'extraction d'une chaîne à partir d'un vecteur de caractères

J'ai des difficultés à extraire certaines correspondances de mon vecteur de caractères que j'ai nommé classes à l'aide de la bibliothèque stringr :

> 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"

Un petit extrait de classes :

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

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

Je peux clairement voir que le mot "STA 190X" est dans mon vecteur, mais je n'arrive pas à l'extraire:

...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...

Mais si je copie et colle une section directement dans la fonction, cela fonctionne:

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

Quelqu'un sait pourquoi? p>


4 commentaires

Ce que vous voyez à l'écran est différent de ce que votre ordinateur voit lorsqu'il télécharge la page via read_lines (essayez de voir la source ou Ctrl + U dans votre navigateur). Cliquez avec le bouton droit sur la page et cliquez sur inspecter. Nous vous recommandons de réessayer avec quelque chose comme le package rvest .


De quel package provient read_lines ? stringr ne le sait pas. Quelle est la sortie de str (classes) ?


@dario la sortie de str (classes) est chr "

3 Réponses :


1
votes

Nous pouvons faire le traitement avec rvest et extraire les bons 'nœuds'

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"


2 commentaires

J'ai copié votre code, mais ma sortie était "NA", pas "STA 190X"


@John Désolé, je ne peux pas le reproduire avec packageVersion ('rvest') [1] '0.3.4'> packageVersion ('stringr') [1] '1.4.0' sur R 3.6.2



1
votes

Une solution simple:

Vous n'avez qu'à adapter un peu votre regex pour qu'elle corresponde non seulement à un espace, mais à tout ce qui n'est pas une lettre ou un nombre:

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

Une explication:

C'est la chose la plus étrange:

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

Le code ci-dessus renvoie une correspondance de quelque chose qui ressemble à la chaîne 'STA 190X' mais ne l'est pas .

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

Cela ne peut pas être parce qu'il ne peut pas y avoir d'espace entre STA et 190X. S'il y avait eu un espace, le gregexpr ne l'aurait pas attrapé ( STA [^] * 190X correspond à tout ce qui ne correspond pas ont un (des) espace (s) entre STA et 190X)

Edit:

Le tracé s'épaissit:

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

Renvoie no match, ce qui, je pense, signifie que le personnage mystère est l'un des suivants:

[: punct:]

Caractères de ponctuation: ! "# $% & '() * +, -. /:; ? @ [\] ^ _` {|} ~.


0 commentaires

1
votes

L'espace blanc semble être un problème. Essayez d'utiliser \\ s pour les espaces et cela devrait fonctionner.

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

#[1] "STA 190X"


0 commentaires