R中两个[]之间的正则表达式字符串

时间:2015-05-25 01:14:15

标签: regex r

我再次陷入正则表达式,但这次是在R。

我面临的问题是我是一个向量,我想在向量中的每一行中为两个[]之间提取一个字符串。但是,有时我会遇到整个语句中有多个[]系列的情况,因此我正在恢复[]中每行的所有字符串。在所有情况下,我只需要在[]而不是第二个或更多实例中恢复字符串的第一个实例。我的示例数据框是:

. bin/activate
mkdir bin/.debug
ln -s /usr/lib/debug/usr/bin/python2.7-gdb.py bin/.debug/python-gdb.py
ln -s /usr/lib/debug/usr/bin/python2.7 bin/.debug/

gdb --args bin/python2.7 ...

我一直在使用的代码恢复字符串和索引并在新数据框中生成一个向量:

comp541_c0_seq1     gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]
comp5041_c0_seq1    gi|460370622|ref|XP_004231150.1| [Solanum lycopersicum] PREDICTED: uncharacterized protein LOC101250457 [Solanum lycopersicum]

我正在使用的数据框的结构是:

pattern <- "\\[\\w*\\s\\w*]"
match<- gregexpr(pattern, data$Description)
data$Species <- regmatches(data$Description, match)

因此我的模式匹配的问题是它返回一些向量(Species),其中一些行具有:

data.frame':    67911 obs. of  6 variables:
 $ Column1           : Factor w/ 67911 levels "comp100012_c0_seq1 ",..: 3344 8565 17875 18974 19059 19220 21429 29791 40214 48529 ...
 $ Description     : Factor w/ 26038 levels "0.0","1.13142e-173",..: NA NA NA NA NA NA NA NA 7970 NA ...

我想要的是:

[Glycine max] # this is good
c("[Solanum lycopersicum]", "[Solanum lycopersicum]") # I only need one set returned

我一直在尝试使用正则表达式。有人会知道如何改进我只需要在[]中提取字符串的第一个实例吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

我认为这个例子应该能够解决你的问题:

txt <- c("[Bracket text]","[Bracket text1] and [Bracket text2]","No brackets in here")
pattern <- "\\[\\w*\\s\\w*]"
mat <- regexpr(pattern,txt)
#[1]  1  1 -1
#attr(,"match.length")
#[1] 14 15 -1
txt[mat != -1] <- regmatches(txt, mat)
txt
#[1] "[Bracket text]"      "[Bracket text1]"     "No brackets in here"

或者,如果你想一次性完成所有操作并返回非匹配的NA值,请尝试:

ifelse(mat != -1, regmatches(txt,mat), NA)
#[1] "[Bracket text]"  "[Bracket text1]" NA 

答案 1 :(得分:1)

使用base-R工具进行字符串操作只会让自己的生活变得艰难。使用rebus创建正则表达式,使用stringi(或stringr)来获取匹配项。

library(rebus)
library(stringi)

txt <- c("[Bracket text]","[Bracket text1] and [Bracket text2]","No brackets in here") # thanks, thelatemail
pattern <- OPEN_BRACKET %R% 
  alnum(1, Inf) %R% 
  space(1, Inf) %R% 
  alnum(1, Inf) %R% 
  "]"
stri_extract_first_regex(txt, pattern)
## [1] "[Bracket text]"  "[Bracket text1]" NA

我怀疑你可能不想保留这些方括号。试试这个变种:

pattern <- OPEN_BRACKET %R% 
  capture(
    alnum(1, Inf) %R% 
    space(1, Inf) %R% 
    alnum(1, Inf)
  ) %R% 
  "]"
stri_match_first_regex(txt, pattern)[, 2]
## [1] "Bracket text"  "Bracket text1" NA