簡體   English   中英

R-使用正則表達式分割字符向量

[英]R - Split character vector using regex

我有一些想要讀取和分析的日志文件。 不幸的是,文件以非常“​​丑陋”的方式保存(中間有很多特殊字符),因此我不能只讀取每一行都是條目的行。 分隔不同條目的唯一方法是使用正則表達式,因為每個條目的開頭均遵循指定的模式。

我的第一種方法是識別字符向量中的模式(我使用來自readr-package的read_file),並使用相應的位置通過strsplit分割向量。 不幸的是,位置似乎並不總是匹配的,因為結果並不總是與條目相對應(我猜特殊字符有問題)。

該文件的典型行如下所示:

16/10/2017,21:51-喬治:這是一個典型的條目

相應的正則表達式如下所示:

([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+):

我想要的第一件事是data.frame,每行對應一個特定的條目(在下一步中,我將模式分為不同的部分)。

到目前為止,我嘗試了以下操作:

regex.log = "([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+):"
log.regex = gregexpr(regex.log, file.log)[[1]]
log.splitted = substring(file.log, log.regex, log.regex[2:355]-1)

可以看出,該日志文件具有355個條目。 前幾個正確分開。 如何在不丟失正則表達式/模式信息的情況下使用正則表達式分隔字符向量?

使用捕獲和非捕獲組來標識要保留的部分,並確保使用錨點:

file.log  =  "16/10/2017, 21:51 - George: This is a typical entry here"
regex.log = "^((?:[[:digit:]]{2})\\/(?:[[:digit:]]{2})\\/(?:[[:digit:]]{4}), (?:[[:digit:]]{2}):(?:[[:digit:]]{2}) - (?:[[:alpha:]]+)): (.*)$"

gsub(regex.log,"\\1",file.log)
>> "16/10/2017, 21:51 - George"
gsub(regex.log,"\\2",file.log)
>> "This is a typical entry here"

暫無
暫無

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

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