字符串删除到最后一个“}”
String remove up to last "}"
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 但我发现文档中基于水果的示例在处理比“banana”更复杂的正则表达式时有限且无用。
我想删除从第一个坐标单元格到最后一个“}”的所有内容。我以为我可以用 str_remove(., "^.*}")
或 gsub 添加一个管道,但它没有用。有什么建议吗?
您可以使用
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
默认使用的regex引擎是TRE,这个regex引擎不需要}
要转义的字符,它不是那里的特殊正则表达式元字符。但是,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
我正在 Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)
因为 } (thanks to LukeA)
所以 QC1$Coordinates %<>% str_remove(., pattern="^.*\}")
或 QC1$Coordinates %<>% sub(".*}", "", .)
在功能上是等价的(感谢 Wiktor 的替代)。似乎 sub()
出于某种原因并没有对 }
感到害怕。
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 但我发现文档中基于水果的示例在处理比“banana”更复杂的正则表达式时有限且无用。
我想删除从第一个坐标单元格到最后一个“}”的所有内容。我以为我可以用 str_remove(., "^.*}")
或 gsub 添加一个管道,但它没有用。有什么建议吗?
您可以使用
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
默认使用的regex引擎是TRE,这个regex引擎不需要}
要转义的字符,它不是那里的特殊正则表达式元字符。但是,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
我正在 Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)
因为 }
所以 QC1$Coordinates %<>% str_remove(., pattern="^.*\}")
或 QC1$Coordinates %<>% sub(".*}", "", .)
在功能上是等价的(感谢 Wiktor 的替代)。似乎 sub()
出于某种原因并没有对 }
感到害怕。