字符串删除直到最后一个“}”

时间:2021-05-27 19:08:00

标签: r regex rvest data-wrangling

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 添加一个管道,但它没有用。有什么建议吗?

2 个答案:

答案 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() 似乎并不害怕 }