我有以下字符串:123-4567-C-4321-DD.xxxx
我只想提取“ C-”之后的四个数字“ 4321”。请注意,“ C”也可以是“ P”,可以是大写或小写。
我尝试了许多看起来可行的建议,但无济于事。这似乎很接近,但实际上是抓住了它发现的前四个数字:
[^c|C,p|P-]{4}
预期= 4321, 实际= 4567
答案 0 :(得分:3)
这将起作用。
(?<=[(C|c|P|p)]-)([0-9]){4}
答案 1 :(得分:1)
您可以使用str_match并使用(?i)
获得不区分大小写的匹配并在第1组中捕获4位数字:
(?i)-[CP]-([0-9]{4})
例如:
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}
匹配c
,C
中任何一个都不匹配的4倍,P
,p
,|
,,
或-
答案 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)
括号括起来。
因此您可以使用组导出要获取的数字。
答案 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")