两个特定模式之间的正则表达式(包括换行符)

标签 r regex text

我有一个具有以下模式的文本文件:

Prof. Imperdiet montes, metus elementum eleifend eget eget adipiscing augue.
Abstract title: Lorem ipsum dolor sit amet, consectetuer adipiscing

A, nec, quam eleifend quis, magnis sit pretium. leo augue. amet, elit. vel
Vel, dis eget nascetur justo. imperdiet consequat et sit Nam Aenean a, Quisque
Enim. a, dui. Aenean lorem Phasellus commodo quis, pretium ultricies nascetur
tincidunt. sem. vitae,
montes, tellus. amet, venenatis natoque enim. fringilla
quis, vitae, Aenean Etiam viverra ipsum dapibus ut elementum Aenean Lorem eget,
nisi mollis Curabitur Quisque Aenean rhoncus sociis justo, sem. justo, vel
Aenean ultricies nec, eu laoreet.

Dr. Enim. vitae, feugiat in, Aenean
Abstract title: Massa. sociis dis dapibus dolor semper ipsum
jalor

Semper tincidunt. ullamcorper commodo magnis viverra pede elit. eget aliquet
eleifend vel, eleifend feugiat pede Vivamus ridiculus vitae, a, ligula, et Nulla
ligula vulputate ac, nisi. enim dapibus. Donec metus In sit dolor Nam ultricies
imperdiet. pellentesque Cras eu, massa quis porttitor parturient varius ut,
Phasellus arcu. pretium. quam augue. eu, adipiscing felis, enim. ante,
vulputate Integer dui. ultricies a, dictum rutrum. Nullam nec, quis,
consequat Cum tellus. dis felis dolor. nulla Aliquam Donec massa. justo. in,
nascetur
Semper tincidunt. ullamcorper commodo magnis viverra pede elit. eget aliquet
eleifend vel, eleifend feugiat pede Vivamus ridiculus vitae, a, ligula, et Nulla


Dr. Justo. nisi elementum ante, Donec Aenean Nulla
Abstract title:

Aenean consectetuer leo penatibus eget imperdiet nisi. consequat
lorem pretium mus. 

Prof. Dr. Aliquam metus semper
Abstract title: Aliquet augue. amet, enim ut justo, nec, eleifend lorem enim. nisi. ipsum
eleifend
More information will be available soon.

我想提取这些部分:

Abstract title: Lorem ipsum dolor sit amet, consectetuer adipiscing

Abstract title: Massa. sociis dis dapibus dolor semper ipsum jalor

Abstract title:

Abstract title: Aliquet augue. amet, enim ut justo, nec, eleifend lorem enim. nisi. ipsum eleifend More information will be available soon.

现在,我发现这些很有帮助:

但是(?<=(Abstract title:))(.*)(?=\n{2})仅返回

Abstract title: Lorem ipsum dolor sit amet, consectetuer adipiscing

Abstract title:

此外,我不确定哪种软件工具最有效 – , , ?如果这是菜鸟问题,请原谅,但我愿意接受建议。

最佳答案

在 R 中,您可以使用以下命令提取匹配项并将匹配项内的所有空格“规范化”为常规单个空格

x <- "Prof. Imperdiet montes, metus elementum eleifend eget eget adipiscing augue.\nAbstract title: Lorem ipsum dolor sit amet, consectetuer adipiscing\n\nA, nec, quam eleifend quis, magnis sit pretium. leo augue. amet, elit. vel\n\nVel, dis eget nascetur justo. imperdiet consequat et sit Nam Aenean a, Quisque\nEnim. a, dui. Aenean lorem Phasellus commodo quis, pretium ultricies nascetur\ntincidunt. sem. vitae,\nmontes, tellus. amet, venenatis natoque enim. fringilla\nquis, vitae, Aenean Etiam viverra ipsum dapibus ut elementum Aenean Lorem eget,\nnisi mollis Curabitur Quisque Aenean rhoncus sociis justo, sem. justo, vel\nAenean ultricies nec, eu laoreet.\n\nDr. Enim. vitae, feugiat in, Aenean\nAbstract title: Massa. sociis dis dapibus dolor semper ipsum\njalor\n\nSemper tincidunt. ullamcorper commodo magnis viverra pede elit. eget aliquet\neleifend vel, eleifend feugiat pede Vivamus ridiculus vitae, a, ligula, et Nulla\nligula vulputate ac, nisi. enim dapibus. Donec metus In sit dolor Nam ultricies\nimperdiet. pellentesque Cras eu, massa quis porttitor parturient varius ut,\nPhasellus arcu. pretium. quam augue. eu, adipiscing felis, enim. ante,\nvulputate Integer dui. ultricies a, dictum rutrum. Nullam nec, quis,\nconsequat Cum tellus. dis felis dolor. nulla Aliquam Donec massa. justo. in,\nnascetur\nSemper tincidunt. ullamcorper commodo magnis viverra pede elit. eget aliquet\neleifend vel, eleifend feugiat pede Vivamus ridiculus vitae, a, ligula, et Nulla\n\n\nDr. Justo. nisi elementum ante, Donec Aenean Nulla\nAbstract title:\n\nAenean consectetuer leo penatibus eget imperdiet nisi. consequat\nlorem pretium mus. \n\nProf. Dr. Aliquam metus semper\nAbstract title: Aliquet augue. amet, enim ut justo, nec, eleifend lorem enim. nisi. ipsum\neleifend\nMore information will be available soon.\n"
library(stringr)
pattern <- "(?<=Abstract title:).*(?:\n(?!\n).*)*"
results <- lapply(str_extract_all(x, pattern), function(z) trimws(gsub("\\s+", " ", z)))

results看起来像

[[1]]
[1] "Lorem ipsum dolor sit amet, consectetuer adipiscing"                                                                        
[2] "Massa. sociis dis dapibus dolor semper ipsum jalor"                                                                         
[3] ""                                                                                                                           
[4] "Aliquet augue. amet, enim ut justo, nec, eleifend lorem enim. nisi. ipsum eleifend More information will be available soon."

请参阅R demo onlineregex demo .

正则表达式详细信息:

  • (?<=Abstract title:) - 与紧接 Abstract title: 之前的位置匹配的正向后查找
  • .* - 除了换行符之外的任何零个或多个字符,尽可能多
  • (?:\n(?!\n).*)* - 零个或多个序列
    • \n(?!\n) - 换行符后面没有紧跟着另一个换行符
    • .* - 除了换行符之外的任何零个或多个字符,尽可能多

lapply(..., function(z) trimws(gsub("\\s+", " ", z))) “缩小”结果列表中的空白。

将文本文件解析为两列

你可以使用

library(readr)
library(stringr)
file <- read_lines(path)
file_string <- paste(file, collapse="\n")
pattern <- "(?m)^(.+)\n(Abstract title:.*(?:\n(?!\n).*)*)"
res <- str_match_all(file_string, pattern)
res <- lapply(res, function(z) trimws(gsub("\\s+", " ", z[,-1])))

输出为

[[1]]
     [,1]                                                                           [,2]                                                                                                                                         
[1,] "Prof. Imperdiet montes, metus elementum eleifend eget eget adipiscing augue." "Abstract title: Lorem ipsum dolor sit amet, consectetuer adipiscing"                                                                        
[2,] "Dr. Enim. vitae, feugiat in, Aenean"                                          "Abstract title: Massa. sociis dis dapibus dolor semper ipsum jalor"                                                                         
[3,] "Dr. Justo. nisi elementum ante, Donec Aenean Nulla"                           "Abstract title:"                                                                                                                            
[4,] "Prof. Dr. Aliquam metus semper"                                               "Abstract title: Aliquet augue. amet, enim ut justo, nec, eleifend lorem enim. nisi. ipsum eleifend More information will be available soon."

关于两个特定模式之间的正则表达式(包括换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69361662/

相关文章:

r - for 循环的替代方案,用于将矩阵中的元素子集替换为 R 中向量中的元素

r - geom_text : character, 数字和特殊字符中的解析表达式

html - <p> 中的文本颜色不会改变

regex - MacOSX 10.9.5 上的 Sed 错误 "\1 not defined in the RE"

ruby-on-rails - PG::ProgramLimitExceeded: 错误:索引行需要 13904 字节,最大大小为 8191

C# 如何在文本文件中写入多行?

r - ggplot2 避免图例符号周围的方框

html - R - 使用 rvest 抓取受密码保护的网站,而无需在每次循环迭代时登录

python - 从主机字符串中删除最后一个句点

objective-c - 最佳实践 : Partial Regex Matching