精确模式后提取n个字符/数字

时间:2019-04-03 05:26:04

标签: r regex

我有以下字符串:123-4567-C-4321-DD.xxxx

我只想提取“ C-”之后的四个数字“ 4321”。请注意,“ C”也可以是“ P”,可以是大写或小写。

我尝试了许多看起来可行的建议,但无济于事。这似乎很接近,但实际上是抓住了它发现的前四个数字:

[^c|C,p|P-]{4}

预期= 4321, 实际= 4567

6 个答案:

答案 0 :(得分:3)

这将起作用。

(?<=[(C|c|P|p)]-)([0-9]){4}

答案 1 :(得分:1)

您可以使用str_match并使用(?i)获得不区分大小写的匹配并在第1组中捕获4位数字:

(?i)-[CP]-([0-9]{4})

R demo | Regex demo

例如:

library(stringr)
text = "123-4567-C-4321-DD.xxxx"
pattern = "(?i)-[CP]-([0-9]{})"
print(str_match(text, pattern)[,2])

结果

[1] "4321"

或在后面使用积极的表情:

pattern = "(?i)(?<=-[CP]-)[0-9]{4}"
print(str_match(text, pattern)[,1])

注意

character class中,管道|并不代表管道字面意思,而是管道文字。

如果从^开始字符类,则它否定了允许匹配的字符,因此模式[^c|C,p|P-]{4}匹配cC中任何一个都不匹配的4倍,Pp|,-

答案 2 :(得分:0)

您可以尝试这个。

gsub("(.*)([cCpP]-)(\\d{4}).*", "\\3", s, perl=TRUE)
# [1] "4321" "4321" "4321" "4321"

数据

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")

答案 3 :(得分:0)

如果它处于固定位置,则可以使用stringr::str_sub()向后(和向前)计数,或者只能使用基数R substr()进行向前计数。

stringr::str_sub(s, -13, -10)

基本R:

substr(s, 12, 15)

输出:

[1] "4321" "4321" "4321" "4321"

使用@ jay.sf的数据集:

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")

答案 4 :(得分:0)

我在字符串包中使用了str_match函数。

pattern = "-[c|C|p|P]-(\\d{4})"
str_match(text, pattern)

括号括起来。

因此您可以使用组导出要获取的数字。

Code result

答案 5 :(得分:0)

这是一种非正则表达式方法,

sapply(strsplit(s, '-', fixed = TRUE), function(i)i[which(i %in% c('C', 'c', 'p', 'P')) + 1])
#[1] "4321" "4321" "4321" "4321"

数据(摘自@ jay.sf)

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")