使用stringr从R中的系列中提取最后4位数字

时间:2015-02-20 05:25:43

标签: regex r stringr

我想整理从HTML表格中提取的列表。下面介绍一个最小的工作示例。该示例取决于R中的stringr包。第一个示例显示了所需的行为。

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)

据我理解文档,我应该在模式的末尾包含$,以便在字符串的末尾请求匹配。我希望从第二个例子中匹配数字,&#34; 2005&#34;,&#34; 2003&#34;和&#34; 1996&#34;。

4 个答案:

答案 0 :(得分:8)

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"

答案 1 :(得分:7)

您可以非常轻松地使用基础R sub

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

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

此处匹配的模式是.*(任何字符的零或更多),后跟\\d{4}(四个连续数字,我们通过括在括号中捕获),后跟零个或多个字符。

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

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

答案 2 :(得分:2)

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

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

要解决此问题,您可以greed使用所有字符,直到最后一组数字。

years1 <- c('2005-', '2003-', '1984-1992, 1996-')
unlist(str_extract_all(years1, perl('.*\\K\\d{4}')))
# [1] "2005" "2003" "1996"

答案 3 :(得分:1)

\\d{4}[^\\d]*$

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

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