R-按照通用格式从字符串中提取信息

时间:2018-12-18 12:53:12

标签: r regex string

这是对我的原始问题的完整重写,以试图阐明它并尽可能使之易于回答。我的目标是编写一个将字符串作为输入并以表格格式返回其中包含的信息的函数。下面是该函数将面对的两种字符串示例

s1 <- "  9 9875     Γεωργίου Άγγελος Δημήτρης       ΑΒ/Γ  Π/Π Β   00:54:05          167***\r"
s2 <- " 10 8954F    Smith John                      ΔΕΖ   N       ΔΕΝ ΕΚΚΙΝΗΣΕ        0\r"

(对于那些阅读过我原始问题的人,为简单起见,它们是较小的字符串。)

所需的输出为:

 Rank  Code                      Name Club Class         Time Points
    9  9875 Γεωργίου Άγγελος Δημήτρης ΑΒ/Γ Π/Π Β     00:54:05    167
   10 8954F                Smith John  ΔΕΖ     N ΔΕΝ ΕΚΚΙΝΗΣΕ      0

我已经设法使用空格来拆分字符串,

strsplit(s1, " ")[[1]][strsplit(s1, " ")[[1]] != ""]

尽管G. Grothendieck在下面的评论中使用以下方式给出了更为优雅的解决方案:

unlist(strsplit(trimws(s1), " +"))

这导致

"9" "9875" "Γεωργίου" "Άγγελος" "Δημήτρης" "ΑΒ/Γ" "Π/Π" "Β" "00:54:05" "167***\r"

但是,这仍然是有问题的,因为"Γεωργίου" "Άγγελος""Δημήτρης"应该合并为"Γεωργίου Άγγελος Δημήτρης"(请注意元素的数量可以是两个或三个),并且对{{ 1}},应合并为"Π/Π" "Β"

问题

如何使用我拥有的其他信息,即:

  • 元素的顺序将始终相同
  • "Π/Π Β"数据将由两个或三个词组成
  • Name数据(即Club中的ΑΒ/Γs1中的ΔΕΖ)将来自俱乐部的预定义列表(例如存储在名为s2的字符向量
  • sClub数据(即Class中的Π/Π Βs1中的N)将来自预先定义的类列表(例如,存储在名为s2的字符向量
  • sClass数据将始终包含“ \ r”,并且将不包含任何空格。

产生上面所需的输出?

1 个答案:

答案 0 :(得分:0)

定义

sClub <- c("ΑΒ/Γ", "ΔΕΖ")
sClass <- c("Π/Π Β", "N")

我们可以做

library(stringr)
myfun <- function(s)
  gsub("\\*", "", trimws(str_match(s, paste0("^\\s*(\\d+)\\s*?(\\w+)\\s*?([\\w ]+)\\s*(", paste(sClub, collapse = "|"),")\\s*(", paste(sClass, collapse = "|"), ")(.*?)\\s*([^ ]*\r)"))[, -1]))

sapply(list(s1, s2), myfun)
#      [,1]                        [,2]          
# [1,] "9"                         "10"          
# [2,] "9875"                      "8954F"       
# [3,] "Γεωργίου Άγγελος Δημήτρης" "Smith John"  
# [4,] "ΑΒ/Γ"                      "ΔΕΖ"         
# [5,] "Π/Π Β"                     "N"           
# [6,] "00:54:05"                  "ΔΕΝ ΕΚΚΙΝΗΣΕ"
# [7,] "167"                       "0"     

它的工作方式只是考虑所有其他信息并构建一个长的正则表达式。它以删除*并删除开头/结尾空格为结束。