我想在每个标题之前分割此文本(这里只是一个示例)。标题由物种的拉丁名定义,后跟五个\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)
但是,当然不行。
有人有主意吗?
答案 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)