Extract part of string between two different patterns

橙三吉。 提交于 2019-11-29 09:49:00

问题


I try to use stringr package to extract part of a string, which is between two particular patterns.

For example, I have:

my.string <- "nanaqwertybaba"
left.border  <- "nana"
right.border <- "baba"

and by the use of str_extract(string, pattern) function (where pattern is defined by a POSIX regular expression) I would like to receive:

"qwerty"

Solutions from Google did not work.


回答1:


I do not know whether and how this is possible with functions provided by stringr but you can also use base regexpr and substring:

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")")
# "(?<=nana)[a-z]+(?=baba)"

rx <- regexpr(pattern, text=my.string, perl=TRUE)
# [1] 5
# attr(,"match.length")
# [1] 6

substring(my.string, rx, rx+attr(rx, "match.length")-1)
# [1] "qwerty"



回答2:


In base R you can use gsub. The parentheses in the pattern create numbered capturing groups. Here we select the second group in the replacement, i.e. the group between the borders. The . matches any character. The * means that there is zero or more of the preceeding element

gsub(pattern = "(.*nana)(.*)(baba.*)",
     replacement = "\\2",
     x = "xxxnanaRisnicebabayyy")
# "Risnice"



回答3:


I would use str_match from stringr: "str_match extracts capture groups formed by () from the first match. It returns a character matrix with one column for the complete match and one column for each group." ref

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2]

The code above creates a regular expression with paste concatenating the capture group (.+) that captures 1 or more characters, with left and right borders (no spaces between strings).

A single match is assumed. So, [,2] selects the second column from the matrix returned by str_match.




回答4:


You can use the package unglue:

library(unglue)
my.string <- "nanaqwertybaba"
unglue_vec(my.string, "nana{res}baba")
#> [1] "qwerty"


来源:https://stackoverflow.com/questions/22924183/extract-part-of-string-between-two-different-patterns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!