前瞻正则表达式用于字符串拆分

时间:2019-04-12 15:49:59

标签: r regex stringr

我想在每个标题之前分割此文本(这里只是一个示例)。标题由物种的拉丁名定义,后跟五个\n(例如\n\n\n\n\n\nAcampe carinata (Griff.))。

text <- c(", 1981\n\n\n\n\n\nAcampe carinata (Griff.) Panigrahi\n\n\nIndian Name: Kano Kato. Acampe carinata occurs throughout Thailand, and is also found in Myanmar, Sikkim, Mumbai, the Western Ghats and Sri Lanka\n\n\n\n\n\nAcampe praemorsa (Roxb.) Blatt. & McCain\n\n\nsyn. Acampe papillosa Lindl., (Anuradha and Prakash 1994a, b).\n\n\n\n\n\nAcriopsis liliifolia (J. Konig) Seidenf.\n\n\nsyn")

要划分五个\n的位置,这很容易:

split.text <- tstrsplit(text, split = "\\n\\n\\n\\n\\n")

问题在于这种模式不仅出现在文本中的这些情况下(此示例中没有示例,但您知道我的意思)。因此,我们可以忘记此解决方案。 为了精确地分割,我创建了一个包含每个可能属的向量(物种名称的第一个单词;复数:属),并创建了一个正则表达式,可以在我想要的位置进行分割。我工作了,但是删除了五个\n和属名:

genera <- c("Acampe", "Acriopsis", "Aerides", "Agrostophyllum", "Amitostigma", "Anacamptis", "Anaphora", "Anoectochilus", "Anthogonium", "Apostasia", "Appendicula", "Arachnis", "Arundina", "Bletilla")
blop <- str_c(as.vector(unname(sapply(genera, function(x) sprintf("\\n\\n\\n\\n\\n\\%s ", x)))), collapse = "|")
split.text <- tstrsplit(text, split = blop)

我的想法是在类名之前切出一个名字,就是像这样使用前瞻:

blop <- str_c(as.vector(unname(sapply(genera, function(x) sprintf("\\n\\n\\n\\n\\n\\(?=%s\\) ", x)))), collapse = "|")
split.text <- tstrsplit(text, split = blop)

但是,当然不行。
有人有主意吗?

1 个答案:

答案 0 :(得分:0)

似乎Pera样式正则表达式仅支持先行断言。

然后,您的模式中有一个小错误:先行断言后的空格应包含在括号中组:

"\\n(?=Acampe )"而不是"\\n(?=Acampe) "

这些行有效:

library(data.table)  # tstrsplit function
library(stringr)     # str_c function

pattern <- str_c(as.vector(unname(sapply(genera, function(x) 
                                         sprintf("\\n\\n\\n\\n\\n(?=%s )", x)))),
                 collapse="|")
tstrsplit(text, split=pattern, perl=T)