2014-10-25 2 views
5

У меня есть строка a как этот:R Regexp - номер с экстрактом 5 цифр

stundenwerte_FF_00691_19260101_20131231_hist.zip

и хотел бы извлечь 5-значный номер "00691" от него ,

Я попытался с помощью gregexpr и regmatches, а также stringr::str_extract , но не мог figute из правильного rexexp. я дошел до:

gregexpr ("[: цифры {5}:]", а)

Который должен вернуть 5-значный-номер и я не понимаю, как это исправить ,
Это не работает propperly :(

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

Спасибо за вашу помощь заранее!

+0

Это (сайт) [http://regex101.com/] может помочь – user3969377

ответ

8

Вы могли бы просто использовать sub, чтобы захватить цифры, IMO regmatches не является необходимым для этого простого случая.

x <- 'stundenwerte_FF_00691_19260101_20131231_hist.zip' 
sub('\\D*(\\d{5}).*', '\\1', x) 
# [1] "00691" 

Edit: Если у вас есть другие строки, содержащие цифры впереди, вы бы немного изменить выражение.

sub('.*_(\\d{5})_.*', '\\1', x) 
+1

Обратите внимание, что это регулярное выражение предполагает, что перед символом '00691' цифры не отображаются. –

+0

Очень верно, это основано на заданной строке, в которой, если бы намерение OP было соответствовать 5 цифрам между '_' ...' _', я бы написал ответ, который вы предоставили. – hwnd

4

Вы можете попробовать ниже регулярное выражение, которое использует отрицательные утверждения lookaround. Мы не можем использовать границы слов здесь, как \\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) Отрицательный lookbehind утверждает, что предшествующее совпадение будет любым, но не цифрой.
  • \\d{5} Соответствует точно 5 цифрам.
  • (?!\\d) Отрицательный взгляд утверждает, что персонаж, следующий за матчем, будет любым, но не цифрой.
+0

' (? <= _) \\ d {5} (? = _) 'также работает для этого конкретного примера. –

5

1) суб

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" 
1

Пусть строка будет:

ss ="stundenwerte_FF_00691_19260101_20131231_hist.zip" 

Вы можете разделить строку и unlist подстрок:

ll = unlist(strsplit(ss,'_')) 

Затем получить индексы подстановок t о ИСТИНА, если они находятся 5 символов:

idx = sapply(ll, nchar)==5 

И получить те, которые 5 символов:

ll[idx] 
[1] "00691" 
Смежные вопросы