这是对我的原始问题的完整重写,以试图阐明它并尽可能使之易于回答。我的目标是编写一个将字符串作为输入并以表格格式返回其中包含的信息的函数。下面是该函数将面对的两种字符串示例
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”,并且将不包含任何空格。产生上面所需的输出?
答案 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"
它的工作方式只是考虑所有其他信息并构建一个长的正则表达式。它以删除*
并删除开头/结尾空格为结束。