我有一个像这样的字符串a
:
stundenwerte_FF_00691_19260101_20131231_hist.zip
并想提取5位数字" 00691"从它。
我尝试使用gregexpr
和regmatches
以及stringr::str_extract
但无法确定正确的rexexp。
我来到了:
gregexpr(" [:数字{5}:]"中的A)
哪个应该返回5位数字,我不明白如何解决它 这不合适:(
m <- gregexpr("[:digits{5}:]",a)
regmatches(a,m)
提前感谢您的帮助!
答案 0 :(得分:9)
您只需使用sub
来抓取数字,IMO regmatches
对于这个简单的案例不是必需的。
x <- 'stundenwerte_FF_00691_19260101_20131231_hist.zip'
sub('\\D*(\\d{5}).*', '\\1', x)
# [1] "00691"
编辑:如果您有其他字符串包含前面的数字,您可以略微修改表达式。
sub('.*_(\\d{5})_.*', '\\1', x)
答案 1 :(得分:6)
1)sub
sub(".*_(\\d{5})_.*", "\\1", x)
## [1] "00691"
2)gsubfn :: strapplyc 如果我们使用strapplyc
,可以略微简化正则表达式:
library(gsubfn)
strapplyc(x, "_(\\d{5})_", simplify = TRUE)
## [1] "00691"
3)strsplit 如果我们知道它是第三个字段:
read.table(text = x, sep = "_", colClasses = "character")$V3
## [1] "00691"
3a)或
strsplit(x, "_")[[1]][3]
## [1] "00691"
答案 2 :(得分:4)
您可以尝试使用负面外观断言的以下正则表达式。我们不能在此处使用字词边界,例如\\b\\d{5}\\b
,因为前面和后面的字符_
位于\w
> x <- "stundenwerte_FF_00691_19260101_20131231_hist.zip"
> m <- regexpr("(?<!\\d)\\d{5}(?!\\d)", x, perl=TRUE)
> regmatches(x, m)
[1] "00691"
> m <- gregexpr("(?<!\\d)\\d{5}(?!\\d)", x, perl=TRUE)
> regmatches(x, m)[[1]]
[1] "00691"
<强>解释强>
(?<!\\d)
负面的后视断言,在比赛之前会有什么但不是数字。\\d{5}
正好匹配5位数。(?!\\d)
否定前瞻断言匹配后的字符可以是任何数字,但不是数字。 答案 3 :(得分:1)
让字符串为:
ss ="stundenwerte_FF_00691_19260101_20131231_hist.zip"
您可以拆分字符串并取消列出子字符串:
ll = unlist(strsplit(ss,'_'))
如果子字符串的索引长度为5个字符,则将其设置为TRUE:
idx = sapply(ll, nchar)==5
获得长度为5个字符的那些:
ll[idx]
[1] "00691"