R Regex - 提取5位数字

时间:2014-10-25 02:27:08

标签: regex r

我有一个像这样的字符串a

  

stundenwerte_FF_00691_19260101_20131231_hist.zip

并想提取5位数字" 00691"从它。

我尝试使用gregexprregmatches以及stringr::str_extract 但无法确定正确的rexexp。 我来到了:

  

gregexpr(" [:数字{5}:]"中的A)

哪个应该返回5位数字,我不明白如何解决它 这不合适:(

m <- gregexpr("[:digits{5}:]",a)
regmatches(a,m)

提前感谢您的帮助!

4 个答案:

答案 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"