[英]Extracting date from string in R using regex
我有以下數據框:
V1 <- c("path/to/file/filename-Aug-4-2017-_to-Aug-4-2017_otherinfo_.csv", "otherpath/to/file/filename-Aug-18-2017-_to-Aug-18-2017_otherinfo_.csv")
df <- as.data.frame(V1)
而且我希望能夠將日期(格式化為日期)提取到名為df $ Date的新列中。 在結合使用regex和str_extract
之前,我已經做過類似的事情:
df$Date <- str_extract(df$V1, "\\d{4}-\\d{2}-\\d{2}")
但是我不確定如何處理這種格式的日期,並且真的不太了解Regex來解決它。 任何幫助將不勝感激。
也對替代方法或方法開放。 謝謝!
如果您的輸入格式非常好,並且知道日期符合three_letters-one_or_two_digits-four_digits
模式,則可以使用
df$Date <- sub(".*?\\b([A-Za-z]{3}-\\d{1,2}-\\d{4})\\b.*", "\\1", df$V1)
觀看R在線演示 :
V1 <- c("path/to/file/filename-Aug-4-2017-_to-Aug-4-2017_otherinfo_.csv", "otherpath/to/file/filename-Aug-18-2017-_to-Aug-18-2017_otherinfo_.csv")
df <- as.data.frame(V1)
df$Date <- sub(".*?\\b([A-Za-z]{3}-\\d{1,2}-\\d{4})\\b.*", "\\1", df$V1)
細節
.*?
-直到第一次出現...為止的任何0+個字符,越少越好。 \\\\b
單詞邊界 ([A-Za-z]{3}-\\\\d{1,2}-\\\\d{4})
-組1(后來從替換模式中以\\1
反向引用來引用):
[A-Za-z]{3}
-3個ASCII字母 -
連字符 \\\\d{1,2}
-1或2位數字 -
連字符 \\\\d{4}
-4位數字 \\\\b
單詞邊界 .*
-字符串末尾的任意0+字符。 因此,將其替換為\\1
僅會使(...)
模式部分捕獲文本。
如果您需要更高的精度(如果您的輸入比可能更混亂),則可以嘗試使用冗長的正則表達式,例如
df$Date <- str_extract(df$V1, "(?i)\\b(Jan|Feb|Ma[ry]|Apr|Ju[nl]|Aug|Sept?|Oct|Nov|Dec)-\\d{1,2}-\\d{4}\\b")
參見regex演示 。
詳細資料 :
(?i)
-不區分大小寫的修飾符(內聯選項) \\b
單詞邊界 (Jan|Feb|Ma[ry]|Apr|Ju[nl]|Aug|Sept?|Oct|Nov|Dec)
-備選方案之一: Jan
, Feb
, Mar
或May
,4月,
6月or
7月,
8月,
9月or
9月,
10月,
11月or
12月 -
連字符 \\d{1,2}
-一位或兩位數 -
連字符 \\d{4}
-四位數 \\b
單詞邊界。 Base-R替代解決方案:
sub(".+(.{3}-[0-9]{1,2}-[0-9]{4}).+", "\\1", df$V1)
"Aug-4-2017" "Aug-18-2017"
說明:
[0-9]{4}
-[0-9]{1,2}-
,也以連字符開頭。 .{3}
並保留第一個匹配項(括號中的所有內容),除此之外別無其他。 編輯
根據Wiktor的評論略有改進:
sub(".{0,}(.{3}-[0-9]{1,2}-[0-9]{4}).{0,}", "\\1", df$V1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.