r语言 - 字符串删除到最后一个"}"



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$坐标第一个单元格的开头为:.mw解析器输出。geo默认值,.mw解析器输出来。geo dms,.mw语法分析器输出。geo-dec{display:inline}。mw语法分析器输出来。geo非默认值,.msw语法分析器输出去。geomulti-punct{dispay:none}。mw语法分析器输出。经度,.mw解析程序输出。纬度{white-space:nowrap}60°49′07〃N 078°08′55〃W/60.81861°N 78.14861°W/60.81861-78.14861(阿库利维克机场(

并且所有其他单元格以数字坐标数据开始。我尝试过str_remove,但我发现文档中基于水果的示例有限,在处理比"更复杂的regex时毫无帮助;香蕉";。

我想删除第一个坐标单元格中的所有内容,直到最后一个"}&";。我想我可以用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)代码行删除直到最后一个}的所有文本,包括字符。

注意:defaul使用的sub/gsub的正则表达式引擎是TRE,该正则表达式引擎不需要转义}字符,它不是一个特殊的正则表达式元字符。然而,str_remove需要转义},因为stringr/stringi函数中使用的正则表达式引擎是ICU,并且该正则表达式引擎与gsub/sub等基本R函数中常用的TRE和PCRE都有很大不同。

所以,你也可以使用

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)因为}是一个特殊的字符(感谢LukeA(

因此QC1$Coordinates %<>% str_remove(., pattern="^.*\}")QC1$Coordinates %<>% sub(".*}", "", .)在功能上是等效的(感谢Wiktor的替代方案(。似乎sub()并没有因为某种原因而与}发生冲突。

相关内容

  • 没有找到相关文章

最新更新