R正则表达式:隔离引号之间的字符串

Posted

技术标签:

【中文标题】R正则表达式:隔离引号之间的字符串【英文标题】:R regular expression: isolate a string between quotes 【发布时间】:2015-06-13 01:46:57 【问题描述】:

我有一个字符串myFunction(arg1=\"hop\",arg2=TRUE)。我想隔离引号之间的内容(本例中为\"hop\"

到目前为止我已经尝试过,但没有成功:

gsub(pattern="(myFunction)(\\(1))(.*)(\\\"1.*\\\"1)(.*)(\\)1)",replacement="//4",x="myFunction(arg1=\"hop\",arg2=TRUE)")

欢迎正则表达式大师的任何帮助!

【问题讨论】:

您需要\"hop\"hop 作为答案,因为描述在引号之间? 隔离是什么意思?您的预期输出是什么? 例如\"hop\" 【参考方案1】:

试试

 sub('[^\"]+\"([^\"]+).*', '\\1', x)
 #[1] "hop"

或者

 sub('[^\"]+(\"[^\"]+.).*', '\\1', x)
 #[1] "\"hop\""

不需要\",因为" 也可以使用

 sub('[^"]*("[^"]*.).*', '\\1', x)
 #[1] "\"hop\""

如果有多个匹配项,正如@AvinashRaj 在他的帖子中提到的那样,sub 可能没有那么有用。使用stringi 的选项是

 library(stringi)
 stri_extract_all_regex(x1, '"[^"]*"')[[1]]
 #[1] "\"hop\""  "\"hop2\""

数据

 x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
 x1 <- "myFunction(arg1=\"hop\",arg2=TRUE arg3=\"hop2\", arg4=TRUE)"

【讨论】:

非常感谢,这很好用。你能解释一下第一个解决方案的基本原理吗? @RockScience 第一个解决方案匹配所有不是\"[^\"]+ 的字符,后跟一个\",然后使用捕获组(括号内)获取不是@ 的字符987654333@,使用\\1提取捕获组。【参考方案2】:

您也可以使用regmatches 函数。 Sub 或 gsub 仅适用于特定输入,对于一般情况,您必须进行抓取而不是删除。

> x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
> regmatches(x, gregexpr('"[^"]*"', x))[[1]]
[1] "\"hop\""

要仅获取引号内的文本,然后将上述函数的结果传递给有助于删除引号的 gsub 函数。

> x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
> gsub('"', '', regmatches(x, gregexpr('"([^"]*)"', x))[[1]])
[1] "hop"
> x <- "myFunction(arg1=\"hop\",arg2=\"TRUE\")"
> gsub('"', '', regmatches(x, gregexpr('"([^"]*)"', x))[[1]])
[1] "hop"  "TRUE"

【讨论】:

【参考方案3】:

你可以试试:

str='myFunction(arg1=\"hop\",arg2=TRUE)'

gsub('.*(\\".*\\").*','\\1',str)
#[1] "\"hop\""

【讨论】:

【参考方案4】:
x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
unlist(strsplit(x,'"'))[2]
# [1] "hop"

【讨论】:

with paste0("\"",unlist(strsplit(x,'\"',perl=T))[2],"\"") 以获得所需的结果...(在 OP 的问题后检查 cmets)

以上是关于R正则表达式:隔离引号之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。

Python正则表达式获取引号之间的字符串

无法使用正则表达式在双引号之间提取字符串

正则表达式返回两个引号之间的字符串“?

如何使用正则表达式从引号之间提取包含所需字符串的组? [关闭]

如何编辑我的正则表达式,使其仅捕获(不包括)引号之间的子字符串?