![](/img/trans.png)
[英]Regex to capture multiple groups of SELECT queries in a single statement with 0 or more UNIONs?
[英]regex select multiple groups
我有以下字符串,要从其中提取第二对冒号之间的内容(示例中的粗体):
“ 20160607181026_0000005:0607181026000000501: ES5206956802492 :479”
我正在使用R特别是stringr包来操作字符串。 我尝试使用的命令是:
str_extract(“ 20160607181026_0000005:0607181026000000501:ES5206956802492:479”,“:(。*):”)
正则表达式模式在命令末尾表示。 这将产生以下结果:
“:0607181026000000501:ES5206956802492:”
我知道有一种将结果分组并向后引用的方法,这将使我只能选择我感兴趣的部分,但似乎无法找出正确的语法。
我该如何实现?
此外word
从stringr
,
library(stringr)
word(v1, 3, sep=':')
#[1] "ES5206956802492"
如果:
之后的第一个字符以LETTERS
开头,那么我们可以使用紧凑的正则表达式。 在这里,我们使用正则表达式环视( (?<=:)
)并匹配紧跟:
[AZ]
( [AZ]
),再加上不是:
( [^:]+
)的多个字符之一。
str_extract(v1, "(?<=:)[A-Z][^:]+")
#[1] "ES5206956802492"
或者如果它是基于所述位置即第二位置时,一个base R
的选择将是匹配的零个或多个非:
( [^:]*
),接着由第一:
后跟零个或多个非:
接着是第二:
与那么,我们捕捉到非:
一组( (...)
和随后的字符休息( .*
)。 在替换中,我们使用后向引用,即\\\\1
(第一个捕获组)。
sub("[^:]*:[^:]*:([^:]+).*", "\\1", v1)
#[1] "ES5206956802492"
或者可以捕获重复部分以使其紧凑
sub("([^:]*:){2}([^:]+).*", "\\2", v1)
#[1] "ES5206956802492"
或使用strsplit
,我们在定界符处分割:
并提取第三个元素。
strsplit(v1, ":")[[1]][3]
#[1] "ES5206956802492"
v1 <- "20160607181026_0000005:0607181026000000501:ES5206956802492:479"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.