9

我想展平从 HTML 表中提取的列表。下面给出了一个最小的工作示例。该示例取决于stringrR 中的包。第一个示例展示了所需的行为。

years <- c("2005-", "2003-")
unlist(str_extract_all(years,"[[:digit:]]{4}"))

[1] "2005" "2003"

当我尝试匹配一系列其他数字中的最后 4 位数字时,下面的示例会产生不希望的结果。

years1 <- c("2005-", "2003-", "1984-1992, 1996-")
unlist(str_extract_all(years1,"[[:digit:]]{4}$"))

character(0)

据我了解文档,我应该$在模式的末尾包含,以便在字符串的末尾请求匹配。我更愿意匹配第二个示例中的数字“2005”、“2003”和“1996”。

4

4 回答 4

14

sub您可以很容易地为此使用base R :

sub('.*(\\d{4}).*', '\\1', years1)

## [1] "2005" "2003" "1996"

这里要匹配的模式是.*(零个或多个任意字符)后跟\\d{4}(四个连续的数字,我们用括号括起来),后跟零个或多个字符。

sub用第二个参数中的值替换匹配的模式。在这种情况下,\\1表示我们想用第一个捕获的子字符串(即四个连续的数字)替换整个匹配的模式。

这里的正则表达式是贪婪的,所以它会绕过 的早期匹配\\d{4},用.*. 仅捕获四个连续数字的最后一个序列。

于 2015-02-20T05:33:04.863 回答
11

stringi包具有对字符串的特定部分进行操作的便捷函数。因此,您可以使用以下内容找到最后一次出现的四个连续数字。

library(stringi)

x <- c("2005-", "2003-", "1984-1992, 1996-")

stri_extract_last_regex(x, "\\d{4}")
# [1] "2005" "2003" "1996"

获得相同结果的其他方法是

stri_sub(x, stri_locate_last_regex(x, "\\d{4}"))
# [1] "2005" "2003" "1996"

## or, since these count as words
stri_extract_last_words(x)
# [1] "2005" "2003" "1996"

## or if you prefer a matrix result
stri_match_last_regex(x, "\\d{4}")
#      [,1]  
# [1,] "2005"
# [2,] "2003"
# [3,] "1996"
于 2015-02-20T05:30:09.200 回答
2

字符串$锚的结尾断言字符串末尾的位置。

说,匹配字符串末尾的四个数字。不幸的是,发生的情况是数字尝试匹配,然后正则表达式引擎前进尝试断言该位置并失败,因为没有在该位置并且连续回溯尝试匹配它们。

要解决此问题,您可以贪婪地消耗所有字符,直到最后一组数字。

years1 <- c('2005-', '2003-', '1984-1992, 1996-')
unlist(str_extract_all(years1, perl('.*\\K\\d{4}')))
# [1] "2005" "2003" "1996"
于 2015-02-20T05:33:44.823 回答
1
\\d{4}[^\\d]*$

试试这个。这应该为你做。见演示。

https://regex101.com/r/kG5pN6/2

于 2015-02-20T05:29:22.337 回答