Rvest 输出在其中一个单元格中插入一长串额外数据:
QC1 <- read_html("https://en.wikipedia.org/wiki/List_of_airports_in_Quebec")%>%
html_node('body #content #bodyContent #mw-content-text .mw-parser-output table') %>%
html_table(fill = TRUE)
QC1$Coordinates 第一个单元格以: .mw-parser-output .geo-default,.mw-parser-output .geo-dms,.mw-parser-output .geo-dec{display:inline}.mw-parser-output .geo-nondefault,.mw -parser-output .geo-multi-punct{display:none}.mw-parser-output .longitude,.mw-parser-output .latitude{white-space:nowrap}60°49′07″N 078°08′ 55″W / 60.81861°N 78.14861°W / 60.81861; -78.14861 (阿库利维克机场)
和所有其他单元格都以数字坐标数据开头。我尝试过 str_remove,但我发现文档中基于水果的示例在处理比“香蕉”更复杂的正则表达式时有限且无用。
我想删除从第一个坐标单元格到最后一个“}”的所有内容。我以为我可以用 str_remove(., "^.*}")
或 gsub 添加一个管道,但它没有用。有什么建议吗?
答案 0 :(得分:2)
你可以使用
library(textreadr)
library(dplyr)
library(rvest)
QC1 <- read_html("https://en.wikipedia.org/wiki/List_of_airports_in_Quebec")%>%
html_node('body #content #bodyContent #mw-content-text .mw-parser-output table') %>%
html_table(fill = TRUE)
QC1$Coordinates <- sub(".*}", "", QC1$Coordinates)
第一项将按预期显示:
> QC1$Coordinates[1]
[1] "60°49′07″N 078°08′55″W / 60.81861°N 78.14861°W / 60.81861; -78.14861 (Akulivik Airport)"
sub(".*}", "", QC1$Coordinates)
代码行删除直到最后一个 }
的所有文本,包括字符。
注意:sub
/gsub
默认使用的正则表达式引擎是 TRE,并且这个正则表达式引擎不需要转义 }
字符,它不是一个特殊的正则表达式元字符。但是,str_remove
需要对 }
进行转义,因为 stringr
/stringi
函数中使用的正则表达式引擎是 ICU,而这个正则表达式引擎与通常的 TRE 和 PCRE 有很大不同在 gsub
/sub
等基础 R 函数中使用。
所以,你也可以使用
str_remove(., "^.*\\}")
str_remove(., "(?s)^.*\\}") ## If there are line breaks before last }
str_remove(., "^.*[}]") ## Inside brackets, } is not special
答案 1 :(得分:0)
我收到了 Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)
因为} is a special character(感谢LukeA)
所以 QC1$Coordinates %<>% str_remove(., pattern="^.*\\}")
或 QC1$Coordinates %<>% sub(".*}", "", .)
在功能上是等效的(感谢 Wiktor 的替代方案)。出于某种原因,sub()
似乎并不害怕 }
。