我有一个字符串列表如下:
df = read.table(text="AC1=60;AD=393,115;AF1=0.318816;BQB=0.508823;DP=1016;DP4=393
AC1=190;AD=2,747;AF1=1;BQB=0.0722892;DP=749;DP4=2,0,747,0;FQ=-43.6844
AC1=150;AD=1,5;AF1=0.787353;DP=6;DP4=1,0,5,0;VDB=0.00215942
AC1=47;AD=660,182;AF1=0.24862;BQB=0.680047;DP=1684;DP4=660,0,182,0
AC1=47;AD=659,183;AF1=0.248425;DP=842;DP4=0,659,0,183;FQ=999
AC1=78;AD=23,17;AF1=0.408247;BQB=1;DP=40;DP4=23,0,17,0", header=FALSE, stringsAsFactors=F)
每个元素由";"分隔。我想只提取出来" DP = [0-9]"部分。结果预计为:
DP=1016
DP=749
DP=6
DP=1684
DP=842
DP=40
我感谢任何帮助。
答案 0 :(得分:2)
在基地:
$request
当正则表达式上的常驻天才建议使用包进行文本提取时,我感到很惊讶。在提取特定字符串时,gsub(".*((?<=;)DP=[^;]+(?=;)).*", "\\1", df$V1, perl=TRUE)
#[1] "DP=1016" "DP=749" "DP=6" "DP=842" "DP=1684" "DP=40"
和sub
会变得不守规矩:
gsub
答案 1 :(得分:1)
这是一个可行的正则表达式
gsub(".*;(DP=[0-9.]+);.*$", "\\1", df$V1)
如果情况是“DP =”子字符串包含用逗号分隔的多个条目,在示例数据中某些情况下像“DP4 =”这样的子字符串,则在下面的注释中注释为@ pierre-lafortune,以及在他的回答中,你可能会更好地使用[^;]角色类:
gsub(".*;(DP=[^;]+);.*$", "\\1", df$V1)
当然,您只需将逗号添加到角色类
即可gsub(".*;(DP=[0-9.,]+);.*$", "\\1", df$V1)
但也可能还有其他字符要保留。所以[^;]将是最具包容性的方法。