我正在尝试使用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)
答案 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)"