您似乎想拆分,而不是提取,使用匹配两个或多个连续点的模式:
a <- "60.4 (b)(33) and (e)(1) revised....................................46111"
unlist(stringr::str_split(a, "\\.{2,}"))
## => [1] "60.4 (b)(33) and (e)(1) revised" "46111"
## Base R strsplit:
unlist(strsplit(a, "\\.{2,}"))
## => [1] "60.4 (b)(33) and (e)(1) revised" "46111"
这里还有另一种可能的拆分正则表达式:您可以匹配任何一个或多个点,其后跟在字符串末尾的一个或多个数字:
unlist(stringr::str_split(a, "\\.+(?=\\d+$)"))
unlist(strsplit(a, "\\.+(?=\\d+$)", perl=TRUE))
两者都产生相同的[1] "60.4 (b)(33) and (e)(1) revised" "46111" 输出。这里,\.+ 匹配一个或多个点,(?=\d+$) 是一个正向前瞻,它匹配紧随其后是一个或多个数字 (\d+) 和字符串结尾 ($) 的位置。
另一种方法是匹配 str_match(捕获您需要的位):
res <- stringr::str_match(a, "^(.*?)\\.+(\\d+)$")
res[,-1]
# => [1] "60.4 (b)(33) and (e)(1) revised" "46111"
这里,
-
^ - 匹配字符串的开头
-
(.*?) - 第 1 组:除换行符之外的任何零个或多个字符,尽可能少
-
\.+ - 一个或多个点
-
(\d+) - 第 2 组:一位或多位数字
-
$ - 字符串结束。
res[,-1] 是删除包含完整匹配项的第一列所必需的。