簡體   English   中英

提取兩個單詞之間的字符串,具有多種模式

[英]Extract a string between two words, with multiple patterns

我有一系列字符串,例如“任命 XX 為負責人”、“任命 YY 為負責人”(包含在標有“標題”的列中標有“df”的數據框中)

我想提取兩個不同表達式之間的名稱 XX、XY。

我目前正在使用以下內容:

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=Appointment of).*(?= as)", ignore_case=TRUE))

但是,這僅適用於兩種可能的模式之一。

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=Appointment of).*(?= as)"|"(?<=joins).*(?= as)", ignore_case=TRUE))

這當然行不通。 如何創建多個模式以輸入 str_extract?

如果需要,很高興提供更多詳細信息!

非常感謝

strapply 可以在不使用零寬度結構的情況下做到這一點。 僅返回第二個捕獲組。

library(gsubfn)

x <- c("the appointment of XX as head", "appoints YY as head") # input
strapply(x, "(appointment of|appoints) (.*?) as head", ~ ..2, simplify = TRUE)
## [1] "XX" "YY"

或使用 (?:...) 指定第一個帶括號的部分不是捕獲組:

strapply(x, "(?:appointment of|appoints) (.*?) as head", simplify = TRUE)
## [1] "XX" "YY"

底座 R

在基礎 R 中,如果 x 的每個組件都匹配,則可以使用 sub 完成

sub(".*(appointment of|appoints) (.*?) as head.*", "\\2", x)
## [1] "XX" "YY"

如果不是,則為 strcapture

proto <- data.frame(dummy = character(0), value = character(0))
strcapture("(appointment of|appoints) (.*?) as head", x, proto)[, 2]
## [1] "XX" "YY"

您可以使用

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=\\bAppointment of\\s|\\bjoins\\s).*?(?=\\s+as\\b)", ignore_case=TRUE))

詳情

  • (?<= - 積極回顧的開始
    • \bAppointment of\s - 一個單詞邊界( \b ), Appointment of ,然后是一個空白字符( \s
  • | - 或者
    • \bjoins\s - 一個完整的單詞joins和一個空格
  • ) - 后視結束
  • .*? - 除換行符以外的任何零個或多個字符
  • (?=\s+as\b) - 需要一個或多個空格、 as和緊挨當前位置右側的單詞邊界的正向前瞻。

請注意,在stringr中,lookbehind 模式不是嚴格固定寬度的,您可以使用

"(?<=\\bAppointment of\\s{1,100}|\\bjoins\\s{1,100}).*?(?=\\s+as\\b)"

其中\s{1,100}可以匹配一到一百個空白字符。

暫無
暫無

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

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