簡體   English   中英

使用正則表達式從R中的字符串中提取日期

[英]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) -備選方案之一: JanFebMarMay ,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.

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