我有以下字符串,我想从中提取第二对冒号之间的内容(在示例中以粗体显示):
" 20160607181026_0000005:0607181026000000501:的 ES5206956802492 :479"
我正在使用R,特别是stringr包来操作字符串。 我试图使用的命令是:
str_extract(" 20160607181026_0000005:0607181026000000501:ES5206956802492:479",":(。*):")
其中正则表达式模式在命令末尾表示。这会产生以下结果:
":0607181026000000501:ES5206956802492:"
我知道有一种方法可以对结果进行分组并对它们进行反向引用,这样我就可以只选择我感兴趣的部分,但我似乎无法找出正确的语法
我怎样才能做到这一点?
答案 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
: