提取字符串中的所有子串

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"