假设我有看起来像这样的文本字符串:

A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3

在这里,我想识别标记序列(A 是一个标记,I3 是一个标记等), 引导到包含 的子序列,只有 IX 标记(即 I1I2 ,包含 I3I3 ,该子序列的长度可以为 1(即是单个 I3 标记),也可以是无限长度,但始终需要包含至少 1 个 I3 标记,并且只能包含 IX 标记。在通向 IX 子序列的子序列中,可以包含 I1I2 ,但不能包含 I3

在上面的字符串中,我需要确定:
A-B-C-I1-I2-D-E-F

这导致包含 I1-I3I3 子序列


D-D-D-D

这导致包含至少 1 个 I1-I1-I2-I1-I1-I3-I3I3 子序列。

下面是一些额外的例子:
A-B-I3-C-I3

从这个字符串我们应该识别 A-B 因为它后面跟着一个包含 I3 的 1 子序列,还有 C ,因为它后面跟着一个包含 I3 的 1 子序列。

和:
I3-A-I3

这里 A 应该被识别,因为它后面是包含 I3 的 1 子序列。第一个 I3 本身不会被识别,因为我们只对后面跟着包含 IXI3 标记子序列的子序列感兴趣。

如何编写完成此任务的通用函数/正则表达式?

最佳答案

使用 strsplit

> x <- "A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3"
> strsplit(x, "(?:-?I\\d+)*-?\\bI3-?(?:I\\d+-?)*")
[[1]]
[1] "A-B-C-I1-I2-D-E-F" "D-D-D-D"

> strsplit("A-B-I3-C-I3", "(?:-?I\\d+)*-?\\bI3\\b-?(?:I\\d+-?)*")
[[1]]
[1] "A-B" "C"

或者
> strsplit("A-B-I3-C-I3", "(?:-?I\\d+)*-?\\bI3\\b-?(?:I3-?)*")
[[1]]
[1] "A-B" "C"

关于regex - 基于复杂规则识别子串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31449589/

10-12 12:30