使用正则表达式提取子字符串

时间:2015-09-25 20:31:53

标签: regex r

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

我的字符串看起来像(!)这个:myStr <- " layout = (3,3); //lala"。 该字符串将始终包含layout关键字,等号和两个大括号(打开...关闭)。但是,两者之间的参数数量可能不同:(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)

过去曾经工作过。这个正则表达式有什么问题?

修改 如果by string包含两对大括号,则子串应该选择左对(另一个用//注释掉):

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)

2 个答案:

答案 0 :(得分:4)

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

  

子串应该选择左对

在左侧部分使用延迟匹配 - .*?

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

答案 1 :(得分:2)

如果需要提取数字和逗号以及括号,请使用这些模式,

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

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