2015-09-25 121 views
3

我试图提取R中的子字符串,使用stringr。有些timeago我写了一个脚本来完成这项工作,但它不再工作。可能是由于更新,但我不知道。使用正则表达式提取子字符串

我的字符串看起来像(!)这样:myStr <- " layout = (3,3); //lala"。 该字符串将始终包含layout关键字,等号和两个大括号(open ... close)。然而,两者之间的论据数量可能有所不同:(1,23,455,22)也是可能的。 )之后的部分也可以变化。

我喜欢从(开始并以)结尾的子字符串。因此这个例子必须给出:(3,3)。其他人可能会给(1,23,455,22)

到现在我用这个:

library(stringr) 
str_extract(" layout = (3,3); //lala", "*\\(.*\\)") 

然而,这不工作了。它给了我这个错误:

Error in stri_extract_first_regex(string, pattern, opts_regex = attr(pattern, : 
    Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX) 

它曾经工作在过去。这个正则表达式有什么不对?

编辑: 如果字符串包含两对大括号,则子应该选择离开对(其他被注释掉与//):

Str <- "layout = (1,2,3,4) //lala(huhu)" 
gsub(".*([(])(.*)([)]).*", "\\1\\2\\3", Str) 
#gives "(huhu)" which is not good; should be (1,2,3,4) 
+0

什么语言,你wrting这个吗? – jessica

+0

你可以使用'strsplit'来分割列,并用'“(”,“)”'来提取中间的列。只是一个想法。 – Veera

+1

尝试'str_extract(Str,“\\([0-9,] + \\)”)' – akrun

回答

4

你的正则表达式"*\\(.*\\)"是不是正确它始于*,一个量词,并且会导致不正确的正则表达式语法问题,因为您不能有多个字符串开始位置(这是解析表达式时由正则表达式检查的逻辑错误)。

The substring should select the left pair

使用延迟匹配的左边部分 - .*?

myStr <- "layout = (1,2,3,4) //lala(huhu)" 
gsub(".*?(\\([^()]*\\)).*", "\\1", myStr) 
## ^^^ 

IDEONE demo

结果:[1] "(1,2,3,4)"

懒惰匹配将确保我们之前的几个字符匹配越好第一次出现后续模式。

注意,如果要提取多(number,number....)值,则需要使用

library(stringr) 
str_extract(Str,"\\(\\d+(\\s*,\\d+)*\\)") 

regex demo here

+0

希望就是这样。 –

+1

是的,是的。谢谢 - 还有其他人。工作得很好。 – dani

2

如果需要提取,使用这些模式与括号一起的数字和逗号,

str_extract(Str,"\\([0-9,]+\\)") 
#[1] "(1,2,3,4)" 

str_extract(myStr,"\\([0-9,]+\\)") 
#[1] "(3,3)"