gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:37:16 24 4
gpt4 key购买 nike

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

我的字符串看起来像(!)这个: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)

最佳答案

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

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 .

关于regex - 使用正则表达式提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32790212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com