我正在尝试从以下半结构和非规则结构化文本http://www.virus.uc.cl/virus_respiratorios/aldia/coment_anteriores_reedit.html
中提取周,年和注释的变量(semana,año和comentario)。我有几周和几年的时间
a <- readtext("http://www.virus.uc.cl/virus_respiratorios/aldia/coment_anteriores_reedit.html")
sem <- str_match_all(a$text, "(?<=semana [a-zÁ-ú]{0,30} {0,1})[0-9]{1,2}")
año <- str_match_all(a$text,"2[0-9]{3}")
但由于并非所有段落都具有周信息,所以我得到的变量数量不同
> lengths(sem)
[1] 301
> lengths(año)
[1] 411
而且我无法在标题之间返回评论,因为以下正则表达式返回了全文:
(?<=Comentario.*[0-9]{4})((.|\n|\r)*)(?=Comentario)
示例输出应如下所示:
Año Semana
1 2018 46
2 2017 NA
3 2016 44
Comentario
1 Las consultas por [...whole bunch of thech untill next “Comentario”...] > 14 años (39%).
2 Las consultas por [...whole bunch of thech untill next “Comentario”...] > 14 años (33%).
3 La información de [...whole bunch of thech untill next “Comentario”...] influenza B con 30%.
答案 0 :(得分:0)
这是什么。与其创建复杂的正则表达式,我们将其分解为几个步骤。首先是按行拆分数据并过滤出相关行,然后使用正则表达式要容易得多。
# Extract text
at <- a[["text"]]
# Split text by line
at_split <- strsplit(at, "\\n+")[[1]] # character vector of lines
# Extract only those lines that start with Comentario and contain at least one number
at_split_com <- at_split[str_detect(at_split, "^Comentario\\s") & str_detect(at_split, "\\d")]
df <- data.frame(
# Year is just the first 4 digit number preceded by space
Año = str_extract(at_split_com, "\\s\\d{4}"),
# Week is assumed to be the first number in the line
Semana = str_extract(at_split_com, "\\d+"),
# THe whole line
Comentario = at_split_com
)
head(df,10)
Año Semana Comentario
1 2018 46 Comentario semanal, semana epidemiológica 46: Del 19 al 25 noviembre, 2018
2 2018 45 Comentario semanal, semana epidemiológica 45: Del 5 al 11 noviembre, 2018
3 2018 44 Comentario semanal, semana epidemiológica 44: Desde el 29 de octubre al 4 noviembre, 2018
4 2018 41 Comentario semanal, semana epidemiológica 41: Desde el 8 al 14 octubre, 2018
5 2018 39 Comentario semanal, semana epidemiológica 39: Desde el 24 al 30 septiembre, 2018
6 2018 38 Comentario semanal, semana epidemiológica 38: Desde el 17 al 23 septiembre, 2018
7 2018 36 Comentario semanal, semana epidemiológica 36: Desde el 3 al 9 de septiembre, 2018
8 2018 35 Comentario semanal, semana epidemiológica 35: Desde el 27 agosto al 2 de septiembre, 2018
9 2018 30 Comentario semanal, semana epidemiológica 30: Desde el 23 al 29 de julio, 2018
10 2018 28 Comentario semanal, semana epidemiológica 28: Desde el 9 al 15 de julio, 2018