2014-12-01 5 views
6
string = "ABC3JFD456" 

Предположим, что у меня указанная выше строка, и я хочу найти, что такое первая цифра в строке и сохранить ее значение. В этом случае я хотел бы сохранить значение 3 (так как это первая цифра в строке). grepl("\\d", string) возвращает только логическое значение, но не говорит мне ничего о том, где и что означает первая цифра. Какое регулярное выражение следует использовать для определения значения первой цифры?R: как найти первую цифру в строке

ответ

0
> which(sapply(strsplit(string, ""), grepl, patt="[[:digit:]]"))[1] 
[1] 4 

Или

> gregexpr("[[:digit:]]", string)[[1]][1] 
[1] 4 

Итак:

> splstr[[1]][ which(sapply(splstr, grepl, patt="[[:digit:]]"))[1] ] 
[1] "3" 

Обратите внимание, что полный результат от gregexpr вызова список, следовательно, необходимо извлечь первый элемент с "[[" :

> gregexpr("[[:digit:]]", string) 
[[1]] 
[1] 4 8 9 10 
attr(,"match.length") 
[1] 1 1 1 1 
attr(,"useBytes") 
[1] TRUE 
+0

Thanks. Теперь, когда у меня есть индекс, как я могу извлечь цифру из строки? 'string [4]' не будет работать – Adrian

+0

'regmatches', который используется ответом Дэвида Аренбурга, будет предпочтительным методом базы R для извлечения регулярных выражений из строк, которые я думаю. Кроме того, 'regexpr' удалит необходимость подмножества результатов' gregexpr' – thelatemail

+0

Да, это правда. Я - регулярное выражение. –

11

База R

regmatches(string, regexpr("\\d", string)) 
## [1] "3" 

Или с помощью stringi

library(stringi) 
stri_extract_first(string, regex = "\\d") 
## [1] "3" 

Или с помощью stringr

library(stringr) 
str_extract(string, "\\d") 
## [1] "3" 
6

1) к югу Попробуйте sub с указанным регулярным выражением, которое не принимает кратчайшую строки до цифры, цифра а затем все следующее и заменяет его цифрой:

sub(".*?(\\d).*", "\\1", string) 

дает:

[1] "3" 

Это также работает, если string вектор строк.

2) strapplyc Было бы также можно использовать strapplyc из gsubfn в этом случае можно было бы использовать еще проще регулярное выражение:

strapplyc(string, "\\d", simplify = TRUE)[1] 

давая одинаковые или использовать это, что дает тот же ответ снова но также работает, если string вектор строк:

sapply(strapplyc(string, "\\d"), "[[", 1) 
2

Получить расположение цифр

tmp <- gregexpr("[0-9]", string) 
iloc <- unlist(tmp)[1] 

Экстракт первая цифра

as.numeric(substr(string,iloc,iloc)) 

Использование RegExpr проще

tmp<-regexpr("[0-9]",string) 
if(tmp[[1]]>=0) { 
    iloc <- tmp[1] 
    num <- as.numeric(substr(string,iloc,iloc)) 
} 
+0

Или просто используйте 'regexpr', который вернет только первый удар [0-9]. – thelatemail

+0

Да, regexpr лучше – user3969377

0

gsub решение, которое основано на замене подстрок предыдущей и последующей первой цифры с пустой строкой:

gsub("^\\D*(?=\\d)|(?<=\\d).*", "", string, perl = TRUE) 
# [1] "3" 
1

Использование rex может сделать этот тип задачи немного проще.

string = c("ABC3JFD456", "ARST4DS324") 

re_matches(string, 
    rex(
    capture(name = "first_number", digit) 
    ) 
) 

#> first_number 
#> 1   3 
#> 2   4 
Смежные вопросы