R str_extract 省略号前后的所有内容
R str_extract everything before and after ellipsis
我正在尝试找到一种方法将中间带有省略号的字符列拆分为两列,省略号之前的所有内容和之后的所有内容。
例如,如果我有:
a <- "60.4 (b)(33) and (e)(1) revised....................................46111"
如何将其拆分为“60.4 (b)(33) 和 (e)(1) 修订版”和“46111”?
我试过:
str_extract(a, ".*\.{2,}")
第一部分,第二部分:
str_extract(a, "\.{2,}.*")
但这两者都保留了省略号,我想删除它。
您似乎想要拆分,而不是提取,具有匹配两个或多个连续点的模式:
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]
是删除具有完整匹配项的第一列所必需的。
我正在尝试找到一种方法将中间带有省略号的字符列拆分为两列,省略号之前的所有内容和之后的所有内容。
例如,如果我有:
a <- "60.4 (b)(33) and (e)(1) revised....................................46111"
如何将其拆分为“60.4 (b)(33) 和 (e)(1) 修订版”和“46111”?
我试过:
str_extract(a, ".*\.{2,}")
第一部分,第二部分:
str_extract(a, "\.{2,}.*")
但这两者都保留了省略号,我想删除它。
您似乎想要拆分,而不是提取,具有匹配两个或多个连续点的模式:
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]
是删除具有完整匹配项的第一列所必需的。