regex 提取R中两个字符串之间的最短和第一次遇到的匹配

jk9hmnmh  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(159)

我希望函数返回以下条件后面的字符串。
1.在“def”之后
1.在“def”之后第一个%ile之前的括号中
因此,理想的输出是“4”,而不是“5”。到目前为止,我能够提取“2)(3)(4”。如果我将函数更改为str_extract_all,输出将变为“2)(3)(4”和“5”。我不知道如何修复此问题。谢谢!

x <- "abc(0)(1)%ile, def(2)(3)(4)%ile(5)%ile"

string.after.match <- str_match(string = x,     
                                pattern = "(?<=def)(.*)")[1, 1]

parentheses.value <- str_extract(string.after.match,         # get value in ()
                                 "(?<=\\()(.*?)(?=\\)\\%ile)")

parentheses.value

qco9c6ql

qco9c6ql1#

sub(".*?def.*?(\\d)\\)%ile.*", "\\1", x)
[1] "4"
qltillow

qltillow2#

下面是一个使用gsub()的单行程序

gsub(".*def.*(\\d+)\\)%ile.*%ile", "\\1", x, perl = TRUE)

这里有一种方法,可以处理任意数量的“%ile“。

x <- "abc(0)(1)%ile, def(2)(3)(4)%ile(5)%ile(9)%ile"
x %>% 
  str_split("def", simplify = TRUE) %>% 
  subset(TRUE, 2) %>% 
  str_split("%ile", simplify = TRUE) %>% 
  subset(TRUE, 1) %>% 
  str_replace(".*(\\d+)\\)$", "\\1")
34gzjxbg

34gzjxbg3#

您可以使用

x <- "abc(0)(1)%ile, def(2)(3)(4)%ile(5)%ile"
library(stringr)
result <- str_match(x, "\\bdef(?:\\((\\d+)\\))+%ile")
result[,2]

请参阅R demo onlineregex demo

  • 详细数据 *:
  • \b-字边界
  • def-def字串
  • (?:\((\d+)\))+-(的零次或多次出现+一个或多个数字(捕获到组1中)+),最后捕获的数字保存在组1中
  • %ile-一个%ile字符串。

相关问题