提取字符串中的所有子串
Extract all substrings in string
我想提取所有以 M 开头并以 *
结尾的子字符串
以下字符串为例;
vec<-c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
理想情况下 return;
MGMTPRLGLESLLE
MTPRLGLESLLE
我试过下面的代码;
regmatches(vec, gregexpr('(?<=M).*?(?=\*)', vec, perl=T))[[1]]
但这会删除第一个 M,并且只会 return 是第一个字符串,而不是其中的所有子字符串。
"GMTPRLGLESLLE"
这可以通过对从您的字符串转换而来的 char 数组的 for 循环来完成。
如果您遇到 M,您开始将字符连接到一个新字符串,直到您遇到一个 *,当您确实遇到一个 * 时,您将新字符串推送到一个字符串数组并从第一步重新开始,直到您到达循环结束。
它不像使用 REGEX 那样有趣,但它是故障安全的。
这里不能使用正则表达式,因为正则语言没有嵌套匹配所需的内存状态。
stringr::str_extract_all("abaca", "a[^a]*a")
只给你麻麻,不给你麻麻。
第一个 M 被删除,因为 (?<=M)
是正面看后面,根据定义,它不是匹配的一部分,但就在它后面。
您可以使用
(?=(M[^*]*)\*)
见regex demo。 详情:
(?=
- 与紧随其后的位置相匹配的正前瞻开始:
(M[^*]*)
- 第 1 组:M
,除 *
字符 之外的零个或多个字符
\*
- 一个 *
字符
)
- 前瞻结束。
参见 R demo:
library(stringr)
vec <- c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
matches <- stringr::str_match_all(vec, "(?=(M[^*]*)\*)")
unlist(lapply(matches, function(z) z[,2]))
## => [1] "MGMTPRLGLESLLE" "MTPRLGLESLLE"
如果您更喜欢基本的 R 解决方案:
vec <- c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
matches <- regmatches(vec, gregexec("(?=(M[^*]*)\*)", vec, perl=TRUE))
unlist(lapply(matches, tail, -1))
## => [1] "MGMTPRLGLESLLE" "MTPRLGLESLLE"
我想提取所有以 M 开头并以 *
结尾的子字符串以下字符串为例;
vec<-c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
理想情况下 return;
MGMTPRLGLESLLE
MTPRLGLESLLE
我试过下面的代码;
regmatches(vec, gregexpr('(?<=M).*?(?=\*)', vec, perl=T))[[1]]
但这会删除第一个 M,并且只会 return 是第一个字符串,而不是其中的所有子字符串。
"GMTPRLGLESLLE"
这可以通过对从您的字符串转换而来的 char 数组的 for 循环来完成。
如果您遇到 M,您开始将字符连接到一个新字符串,直到您遇到一个 *,当您确实遇到一个 * 时,您将新字符串推送到一个字符串数组并从第一步重新开始,直到您到达循环结束。
它不像使用 REGEX 那样有趣,但它是故障安全的。
这里不能使用正则表达式,因为正则语言没有嵌套匹配所需的内存状态。
stringr::str_extract_all("abaca", "a[^a]*a")
只给你麻麻,不给你麻麻。
第一个 M 被删除,因为 (?<=M)
是正面看后面,根据定义,它不是匹配的一部分,但就在它后面。
您可以使用
(?=(M[^*]*)\*)
见regex demo。 详情:
(?=
- 与紧随其后的位置相匹配的正前瞻开始:(M[^*]*)
- 第 1 组:M
,除*
字符 之外的零个或多个字符
\*
- 一个*
字符)
- 前瞻结束。
参见 R demo:
library(stringr)
vec <- c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
matches <- stringr::str_match_all(vec, "(?=(M[^*]*)\*)")
unlist(lapply(matches, function(z) z[,2]))
## => [1] "MGMTPRLGLESLLE" "MTPRLGLESLLE"
如果您更喜欢基本的 R 解决方案:
vec <- c("SHVANSGYMGMTPRLGLESLLE*A*MIRVASQ")
matches <- regmatches(vec, gregexec("(?=(M[^*]*)\*)", vec, perl=TRUE))
unlist(lapply(matches, tail, -1))
## => [1] "MGMTPRLGLESLLE" "MTPRLGLESLLE"