对于那些理解正则表达式的人来说,这应该很容易,因为我正在努力做到这一点。
我有一个看起来像
的字符串向量strings<-c("jklsflk fKASJLJ (LN/WEC/WPS); jsdfjDFSDKTdfkls jfdjk kdkd(LN/WEC/WPS)",
"PEARYMP PEARYVIRGN_16 1 (LN/MP/MP)",
"08VERMLN XF03 08VERMLN_345_3 (XF/CIN/*)")
我想将此向量转换为数据框,其中每行来自原始向量的元素,其中3列,其中每列来自括号中的部分。所以这里的结果将是
col1 col2 col3
"LN" "WEC" "WPS"
"LN" "MP" "MP"
"XF" "CIN" "*"
如果字符串中有多个模式实例,那么它应该采用第一个实例。
我认为我的主要问题是(
是一个特殊的角色而我正试图逃脱它\(
但是我得到一个错误\(
是一个无法识别的转义字符所以我我只是有点失落。
答案 0 :(得分:4)
听起来你忘了逃离\
中的\(
,即\\(
:
do.call(rbind, strsplit(sub('.*?\\((.*?)\\).*', '\\1', strings), split = "/"))
[,1] [,2] [,3]
[1,] "LN" "WEC" "WPS"
[2,] "LN" "MP" "MP"
[3,] "XF" "CIN" "*"
答案 1 :(得分:2)
1)我们定义匹配
的模式left-paren non-slashes slash non-slashes slash non-right-parens remainder
分别对应于以下内容:
\\( ([^/]+) / ([^/]+) / ([^)]+) .*
现在使用strapplyc
提取带括号的部分并简化为矩阵。代码是:
library(gsubfn)
pat <- "\\(([^/]+)/([^/]+)/([^)]+).*"
strapplyc(strings, pat, simplify = cbind)
,并提供:
[,1] [,2] [,3]
[1,] "LN" "WEC" "WPS"
[2,] "LN" "MP" "MP"
[3,] "XF" "CIN" "*"
2)此替代方案使用嵌套在strapplyc
中的strapply
。正则表达式稍微简单一点,它基本上仍然是一行代码,但代码行更长。第一个正则表达式选出第一组parens之间的所有内容,第二个正则表达式提取斜杠分隔的字段:
strapply(strings, "\\(([^)]+).*", ~ strapplyc(x, "[^/]+")[[1]], simplify = rbind)
已修订第一个解决方案的一些改进以及作为第二个解决方案的变体。