我在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
来添加选项...但我不清楚如何(或者,如果它'}我会工作)。
答案 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
的情况下做我想做的事。