我希望通过regex返回前一行中的特定组。
假设我有以下信息,目标是在下一行的微分的基础上提取90的值。
QTY+66:90:PCE
SCC+2
DTM+45:20200416:15
QTY+66:60:PCE
SCC+3
DTM+35:20210614:2
如果我要遍历90的值,我必须查找SCC+2
标记,如果我要查找60,它将是SCC+3
标记。
我在尝试返回值90(?<=^QTY+66:)(d+)(.*n.*SCC+2.*)
时走到了这一步,但这似乎很复杂,我无法仅提取组1。这是regex101的链接。我在实际应用中使用R。谢谢你的帮助!
您可以使用
(?<=:)d+(?=[^drn]*[rn]+.*SCC+2)
请参阅regex演示详细信息:
(?<=:)
-:
必须立即出现在当前位置的左侧d+
-一个或多个数字(?=[^drn]*[rn]+.*SCC+2)
-右边必须有[^drn]*
-除数字、CR和LF之外的任何零个或多个字符[rn]+
-一个或多个CR或LF字符.*SCC+2
-一行中的任何文本,直到第三次出现SCC+2
在R中,您可以使用
library(stringr)
str_extract(vec, "(?<=:)\d+(?=[^\drn]*[rn]+.*SCC\+2)")
以及sub
:的几种基本R方法
sub(".*?\+\d+:(\d+)[^rn]*[rn]+[^rn]*SCC\+2.*", "\1", vec)
sub("(?s).*?\+\d+:(\d+)(?-s).*\R.*SCC\+2(?s).*", "\1", vec, perl=TRUE)
请参阅regex 1演示和regex 2演示。
在线查看R演示:
vec <- "QTY+66:90:PCEnSCC+2nDTM+45:20200416:15nQTY+66:60:PCEnSCC+3nDTM+35:20210614:2"
sub(".*?\+\d+:(\d+)[^rn]*[rn]+[^rn]*SCC\+2.*", "\1", vec)
sub("(?s).*?\+\d+:(\d+)(?-s).*\R.*SCC\+2(?s).*", "\1", vec, perl=TRUE)
library(stringr)
str_extract(vec, "(?<=:)\d+(?=[^\drn]*[rn]+.*SCC\+2)")
均得到CCD_ 13。