簡體   English   中英

R:正則表達式環顧四周,以掌握兩種模式之間的關聯

[英]R: regular expression lookaround(s) to grab whats between two patterns

我有一個帶有字符串的向量,例如:

x <-c('kjsdf_class-X1(z)20_sample-318TT1X.3','kjjwer_class-Z3(z)29_sample-318TT2X.4')

我想用正則表達式得到的是子“講座”和“_Sample”(如“X1(Z)20”和“Z3(Z)29”之間x ),並認為環視正則表達式((? = ...),(?!...),...等等)就可以做到。 雖然無法正常工作!

很抱歉,如果這與其他SO問題類似,例如herehere )。

這與您的想法有些不同,但是可以完成工作。

gsub("(.*class-)|(.)|(_sample.*)", "\\2", x)

邏輯如下,您有3組“字符串”:

1)字符.*期末class-

2)字符.

3)以_sample字符和后綴.*字符

從那些您想要保留第二個“集合” \\\\2

或者另一個可能更容易理解:

gsub("(.*class-)|(_sample.*)", "", x)

接受以class-結尾的任意數量的字符,字符串_sample后跟任意數量的字符,然后將它們替換為NULL字符""

我們可以使用str_extract_alllibrary(stringr)

 library(stringr)
 unlist(str_extract_all(x, '(?<=class-)[^_]+(?=_sample)'))
 #[1] "X1(z)20" "Z3(z)29"

如果字符串中有模式的多個實例,這也應該起作用

 x1 <- paste(x, x)
 str_extract_all(x1, '(?<=class-)[^_]+(?=_sample)')
 #[[1]]
 #[1] "X1(z)20" "X1(z)20"

 #[[2]]
 #[1] "Z3(z)29" "Z3(z)29"

基本上,我們匹配兩個環視( (?<=class-)(?=_sample) )之間的字符。 我們提取不是_字符(基於示例),該字符前面是class-_sample_sample

gsub('.*-([^-]+)_.*','\\1',x)
[1] "X1(z)20" "Z3(z)29"

暫無
暫無

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

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