我有一個相對簡單的問題,但無法在 RegEx 中找出正確的語法。我有多個實驗名稱作為各種格式的字串,例如SEF001DT45或BV004MF。
我想要做的是在數值(在這種情況下為DT和MF )之后選擇第二次出現的兩個字母。
我發現這
[A-Z]{2}
只能解決我的問題一半。如何獲得正確的子字串?
uj5u.com熱心網友回復:
一個可能的解決方案,基于stringr::str_extract和環視:
library(stringr)
strings <- c("SEF001DT45", "BV004MF")
str_extract(strings, "(?<=\\d)[:upper:]{2}")
#> [1] "DT" "MF"
uj5u.com熱心網友回復:
TLDR:通常,您可以PATTERN使用以下方法之一獲得第二次出現的 a
sub('.*?PATTERN.*?(PATTERN).*', '\\1', x)
stringr::str_match(x, 'PATTERN.*?(PATTERN)')[,2]
regmatches(x, regexpr('PATTERN.*?\\KPATTERN', x, perl=TRUE))
細節
您可以使用
x <- c('SEF001DT45','BV004MF')
sub('.*?[A-Z]{2}.*?([A-Z]{2}).*', '\\1', x)
## => [1] "DT" "MF"
請參閱在線 R 演示和正則運算式演示。這里的重點是匹配模式的第二次出現,捕獲它,然后匹配其余的,并替換為對捕獲組值的反向參考。
請注意,sub它將執行單個搜索和替換操作,這很好,因為這里的正則運算式需要整個字串匹配。
詳情:
.*?- 盡可能少的任何零個或多個字符[A-Z]{2}- 兩個大寫 ASCII 字母.*?- 盡可能少的任何零個或多個字符([A-Z]{2})- 第 1 組(\1指該組值):兩個大寫 ASCII 字母.*- 盡可能多的任何零個或多個字符。
您可以使用更簡單的正則運算式來實作這一點stringr::str_match:
x <- c('SEF001DT45','BV004MF')
library(stringr)
results <- stringr::str_match(x, '[A-Z]{2}.*?([A-Z]{2})')
results[,2] ## Get Group 1 values
請參閱此 R 演示。
或者,在基數 R 中使用regmatches/ :regexpr
x <- c('SEF001DT45','BV004MF')
results <- regmatches(x, regexpr('[A-Z]{2}.*?\\K[A-Z]{2}', x, perl=TRUE))
results
請參閱此 R 演示。
在這里,[A-Z]{2}.*?\\K[A-Z]{2}找到前兩個大寫 ASCII 字母,然后盡可能少地匹配任何零個或多個字符(除了換行符,因為使用 PCRE 引擎),然后\K丟棄匹配的文本和[A-Z]{2}模式匹配的末尾雙字母塊的第二次出現。regexpr只找到第一個匹配項。
uj5u.com熱心網友回復:
另一個基本 R 技巧是strsplit
> sapply(strsplit(s, split = "\\d "), `[[`, 2)
[1] "DT" "MF"
或者gsub
> gsub("^.*?(?<=\\d)(\\D ).*", "\\1", s, perl = TRUE)
[1] "DT" "MF"
uj5u.com熱心網友回復:
也許:
s <- c("SEF001DT45", "BV004MF")
sub("[A-Z] \\d ([A-Z]{2}).*", "\\1", s)
#sub("[A-Z] [0-9] ([A-Z]{2}).*", "\\1", s) #Alternative
#[1] "DT" "MF"
where[A-Z]匹配字符、\\d數字、[A-Z]{2}兩個字符以及.*其余字符。選擇插入的內容
。或者對兩個字母的第二次出現
更嚴格的規定:()\\1
sub(".*?[A-Z]{2}[0-9] ([A-Z]{2}).*", "\\1", s)
#[1] "DT" "MF"
如果只提取第一個數字之后的兩個字符就足夠了:
regmatches(s, regexpr("(?<=\\d)[A-Z]{2}", s, perl=TRUE))
#[1] "DT" "MF"
uj5u.com熱心網友回復:
基數 R:
# Using capture groups:
gsub(
".*\\d{2}(\\w{2}).*",
"\\1",
x
)
# Input data:
x <- c(
'SEF001DT45',
'BV004MF'
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/490482.html
上一篇:如何洗掉括號中的部分刺痛?
