如何使用正则表达式返回基于模式的小部分字符

时间:2014-04-14 19:11:05

标签: regex r

对于那些理解正则表达式的人来说,这应该很容易,因为我正在努力做到这一点。

我有一个看起来像

的字符串向量
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"      "*"

如果字符串中有多个模式实例,那么它应该采用第一个实例。

我认为我的主要问题是(是一个特殊的角色而我正试图逃脱它\(但是我得到一个错误\(是一个无法识别的转义字符所以我我只是有点失落。

2 个答案:

答案 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)

已修订第一个解决方案的一些改进以及作为第二个解决方案的变体。