我有一个字符串向量.我想在"#stalls"之后提取一个数字:这些数字位于字符串的中间或末尾.
x <- c("1345 W. Pacific Coast Highway<br/>Wilmington 90710<br/><br/>County: Los Angeles<br/>Date Updated: 6/25/2013<br/>Latitude:-118.28079400<br/>Longitude:33.79077900<br/># of Stalls: 244<br/>Cost: Free", "20601 La Puente Ave<br/>Walnut 91789<br/>County: Los Angeles<br/>Date Updated: 6/18/2007<br/>Latitude: -117.859972<br/>Longitude: 34.017513<br/>Owner: Church<br/>Operator: Caltrans<br/># of Stalls: 40")
Run Code Online (Sandbox Code Playgroud)
这是我的试用版,但还不够.我感谢您的帮助.
gsub(".*\\# of Stalls: ", "", x)
Run Code Online (Sandbox Code Playgroud)
由于它是HTML,您可以使用rvest或其他HTML解析器来首先提取您想要的节点,这使得提取数字变得微不足道.对于这类工作,XPath选择器和函数比CSS更灵活.
library(rvest)
x %>% paste(collapse = '<br/>') %>%
read_html() %>%
html_nodes(xpath = '//text()[contains(., "# of Stalls:")]') %>%
html_text() %>%
readr::parse_number()
#> [1] 244 40
Run Code Online (Sandbox Code Playgroud)
我们匹配一个或多个不是a #
([^#]+
)的字符,从^
字符串的start()后跟一个#
后跟零个或多个不是数字的字符([^0-9]*
)后跟一个或多个数字([0-9]+
)作为一个组((...)
)捕获,然后是其他字符(.*
),并将其替换\\1
为捕获组的backreference()
as.integer(sub("^[^#]+#[^0-9]*([0-9]+).*", "\\1", x))
#[1] 244 40
Run Code Online (Sandbox Code Playgroud)
如果字符串更具体,那么我们可以指定它
as.integer(sub("^[^#]+# of Stalls:\\s+([0-9]+).*", "\\1", x))
#[1] 244 40
Run Code Online (Sandbox Code Playgroud)