簡體   English   中英

正則表達式 R 提取多個字符串匹配

[英]Regex R Extracting multiple string matches

在 R 中,我希望將一系列日志數據解析為分類事件。

我有一個向量調用 regex_text,它是一個連續的字符串(為了清楚起見,這里添加了換行符):

21/08/2014 22:58CONTENT_ACCESS.preparing
21/08/2014 23:00EXE_IN.preparing
21/08/2014 23:07CONTENT_ACCESS.preparing
21/08/2014 23:08CONTENT_ACCESS.preparing
21/08/2014 23:12EXE_CO.preparing
21/08/2014 23:28EXE_IN.preparing
21/08/2014 23:29CONTENT_ACCESS.preparing
21/08/2014 23:30CONTENT_ACCESS.preparing

並想使用正則表達式來處理“CONTENT_ACCESS.preparing”的每個序列的第一個和最后一個時間戳並將它們放入此數據幀中:

          start_ts          stop_ts
1 21/08/2014 22:58 21/08/2014 22:58
          start_ts          stop_ts
2 21/08/2014 23:07 21/08/2014 23:08
          start_ts          stop_ts
3 21/08/2014 23:29 21/08/2014 23:30

'CONTENT_ACCESS.preparing' 可能有很多重復,我的例子只有兩個實例,每個實例有兩個條目。

下面的代碼可以直接在 R 中運行,目前輸出一個條目:

          start_ts          stop_ts
1 21/08/2014 23:07 21/08/2014 23:30

我想獲得有關如何提取兩個條目的指導,如上所述

代碼:

library(stringr)
options(stringsAsFactors = FALSE)

eventised_session <- data.frame(start_ts=as.character(),
                                stop_ts=as.character())

regex_text <- "21/08/2014 22:58CONTENT_ACCESS.preparing21/08/2014 23:00EXE_IN.preparing21/08/2014 23:07CONTENT_ACCESS.preparing21/08/2014 23:08CONTENT_ACCESS.preparing21/08/2014 23:12EXE_CO.preparing21/08/2014 23:28EXE_IN.preparing21/08/2014 23:29CONTENT_ACCESS.preparing21/08/2014 23:30CONTENT_ACCESS.preparing"
regex_pattern <- "(\\d{2}\\/\\d{2}\\/\\d{4}\\s\\d{2}\\:\\d{2})(CONTENT_ACCESS\\.preparing)"


if (grepl(regex_pattern, regex_text, perl=TRUE)) {

  sm <- str_match_all(regex_text, regex_pattern )

  #Get the first and last timestamp in matched sequence
  r_start_ts <- sapply(sm, function(x) x[1, 2])
  r_stop_ts <- sapply(sm, function(x) x[sapply(sm,nrow), sapply(sm, ncol) - 1])

  eventised_session[nrow(eventised_session)+1,] <- c(r_start_ts, r_stop_ts)
  print(eventised_session)
}  

你在尋找這樣的東西嗎?

vec = c("21/08/2014 23:07CONTENT_ACCESS.preparing", "21/08/2014 23:08CONTENT_ACCESS.preparing", "21/08/2014 23:12EXE_CO.preparing", "21/08/2014 23:28EXE_IN.preparing", "21/08/2014 23:29CONTENT_ACCESS.preparing", "21/08/2014 23:30CONTENT_ACCESS.preparing")

setNames(data.frame(gsub("[a-z].*","",t(matrix(grep("CONTENT_ACCESS.preparing",vec,value=T),2)),T)),c("Start_ts","Stop_ts"))
         Start_ts          Stop_ts
1 21/08/2014 23:07 21/08/2014 23:08
2 21/08/2014 23:29 21/08/2014 23:30

如果您的代碼中有regex_text ,那么您可以執行以下操作:

regex_text <- "21/08/2014 23:07CONTENT_ACCESS.preparing21/08/2014 23:08CONTENT_ACCESS.preparing21/08/2014 23:12EXE_CO.preparing21/08/2014 23:28EXE_IN.preparing21/08/2014 23:29CONTENT_ACCESS.preparing21/08/2014 23:30CONTENT_ACCESS.preparing"

a = gsub(".*?(\\d{2}/\\d{2}/\\d{4} \\d{2}:\\d{2})CONTENT_ACCESS[.]preparing.*?","\\1\n",regex_text)

setNames(data.frame(matrix( unlist(strsplit(a,"\n")),ncol = 2,byrow = T)),c("start_ts","stop_ts"))
          start_ts          stop_ts
1 21/08/2014 23:07 21/08/2014 23:08
2 21/08/2014 23:29 21/08/2014 23:30

對於新編輯:

 a = gsub("((.*?preparing){2})","\\1\n ",regex_text)
 b = read.table(text=gsub("(?<=preparing)(?=\\d+)","|",a,perl=T),sep="|",fill=T,h=F)
 d = sub("^(?:(?!CONTENT).)*$|(^.*)CONTENT.*$","\\1",as.matrix(b),perl=T)
 subset(data.frame(start_ts = d[,1],stop_ts = ifelse(d[,2]=="",d[,1],d[,2])),start_ts!="")
           start_ts          stop_ts
1  21/08/2014 22:58 21/08/2014 22:58
2  21/08/2014 23:07 21/08/2014 23:08
4  21/08/2014 23:29 21/08/2014 23:30

您可以創建您正在尋找的匹配實例列表並創建一個循環

for (match in match_list){
#match as in your code
#add into db as in your code
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM