簡體   English   中英

提取兩個不同模式之間的部分字符串

[英]Extract part of string between two different patterns

我嘗試使用stringr包來提取兩個特定模式之間的字符串的一部分。

例如,我有:

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

並通過使用str_extract(string, pattern)函數(其中模式由 POSIX 正則表達式定義),我想收到:

"qwerty"

來自 Google 的解決方案不起作用。

base R你可以使用gsub pattern的括號創建編號的捕獲組。 在這里,我們選擇replacement的第二組,即邊界之間的組。 . 匹配任何角色。 *表示前面的元素中有零個或多個

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

我不知道是否以及如何使用stringr提供的函數,但您也可以使用base regexprsubstring

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"

我會使用str_match “從第一匹配)通過(形成str_match提取捕獲基團,它返回與用於完全匹配的一列和各組一列的字符矩陣。”:從stringr REF

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

上面的代碼創建了一個正則表達式,其中paste連接捕獲組(.+) ,捕獲一個或多個字符,左右邊框(字符串之間沒有空格)。

假設單個匹配。 因此, [,2]str_match返回的矩陣中選擇第二列。

您可以使用包unglue

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM