我想在R字符向量中找到新行中的短字符串

时间:2016-01-25 02:23:36

标签: regex r gsub

我在R中读了几百个单词的文本(使用.txt文件中的read_file)。文本的某些行仅包含\n之前的非常短的片段(例如'图1')。我想用空白\n替换它们。因此,在下文中,我希望gsub排除最后3行。我认为他们都不到10个单词,除了最后可能没有句号.。所有内容都以\n开头和结尾。

Some are long. They might have short segments (like the preceding sentence), but they'll all be over some length, and will almost certainly have at least 2 sentence closings (abnormally long sentences aside). Others are short, like these:

Figure 1: description
  Materials and Methods
Introduction.

我试过了:

gsub("\\n(.{90,}[\\.\\?\\:].*){2,}\\n$", "\n", string1, perl=T)

regex works 即在换行符之后,我们希望在标点符号(.?:)之前出现一些字符(至少50个),并且我们希望该模式在下一个新行之前重复至少两次。我想添加(?gmi)修饰符(至少,它在regex101中使用它们),但是我无法找到如何在R中添加它们。我认为使用修饰符可以使用上面的代码,其他选项(例如gsub\n (text) \n\的{​​{1}}少于90个字符,只有一个':.?'或类似的东西也可能有趣。)

更新 我想我可以使用str_replace_all(test, regex("^\\n(.{50,}[\\.\\?\\:].*){2,}\\n$", multiline = T), "\n")stri_opts_regex stringi来添加选项...但我不清楚如何(或者,如果它'}我会工作)。

1 个答案:

答案 0 :(得分:0)

感谢Carlos的评论,我放弃了正则表达式并且刚刚使用了strsplit之类的

holding <- unlist(strsplit(y,"\n"))
holding <- lapply(holding, function (bits) ifelse(nchar(bits) < 75, "", ifelse(nchar(bits)<150, ifelse(sum(str_count(bits, "\\."),str_count(bits, "\\:"),str_count(bits, "\\?"))<3, "", bits), bits)))
holding <- holding[holding != ""]; # without elements that are empty
#recombine that back into y
y <- paste(holding, collapse = "\n")

不是非常优雅,但在不需要regex的情况下做我想做的事。