正则表达式选择多个组

时间:2016-06-08 09:29:08

标签: regex r

我有以下字符串,我想从中提取第二对冒号之间的内容(在示例中以粗体显示):

" 20160607181026_0000005:0607181026000000501:的 ES5206956802492 :479"

我正在使用R,特别是stringr包来操作字符串。 我试图使用的命令是:

str_extract(" 20160607181026_0000005:0607181026000000501:ES5206956802492:479",":(。*):")

其中正则表达式模式在命令末尾表示。这会产生以下结果:

":0607181026000000501:ES5206956802492:"

我知道有一种方法可以对结果进行分组并对它们进行反向引用,这样我就可以只选择我感兴趣的部分,但我似乎无法找出正确的语法

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

来自word的{​​{1}},

stringr

答案 1 :(得分:2)

如果set myForeach {{varName vals body} {foreach $varName $vals $body}} interp alias {} myForeach {} apply $myForeach myForeach a {1 2 3 4 5} {puts $a} 之后的第一个字符以:开头,那么我们可以使用紧凑的正则表达式。在这里,我们使用正则表达式查找(LETTERS)并匹配(?<=:)后面的一个字母([A-Z]),后跟一个不是:的字符({{ 1}})。

:

或者如果它基于位置即第二个位置,[^:]+选项将匹配零个或多个非str_extract(v1, "(?<=:)[A-Z][^:]+") #[1] "ES5206956802492" base R),后跟第一个: }后跟零或更多非[^:]*,然后是第二个:,然后我们捕获组中的非::),然后是其余字符( :)。在替换中,我们使用反向引用,即(...)(第一个捕获组)。

.*

或者可以捕捉重复部分以使其紧凑

\\1

或者使用sub("[^:]*:[^:]*:([^:]+).*", "\\1", v1) #[1] "ES5206956802492" ,我们在分隔符sub("([^:]*:){2}([^:]+).*", "\\2", v1) #[1] "ES5206956802492" 处拆分并提取第3个元素。

strsplit

数据

: