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

Załóżmy, że mam powyższy ciąg i chciałbym znaleźć pierwszą cyfrę w ciągu i zapisać jej wartość. W tym przypadku chciałbym zapisać wartość 3 (ponieważ jest to pierwsza cyfra w ciągu znaków). grepl("\\d", string) zwraca tylko wartość logiczną, ale nie mówi mi nic o tym, gdzie i czym jest ta pierwsza cyfra. Które wyrażenie regularne powinienem użyć, aby znaleźć wartość pierwszej cyfry?R: jak znaleźć pierwszą cyfrę w ciągu znaków

Odpowiedz

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

Albo

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

Więc:

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

Zauważ, że pełny wynik z wywołania gregexpr jest lista, stąd potrzeba, aby wyodrębnić jego pierwszy element z "[[" :

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

Dzięki. Teraz, gdy mam indeks, w jaki sposób mogę wyodrębnić cyfrę z ciągu? 'string [4]' nie zadziała – Adrian

+0

'regmatches' użyty przez Davida Arenburga byłby zalecaną podstawową metodą R wyodrębniania dopasowań regex z łańcuchów, które myślę. Również 'regexpr' usunie potrzebę podzbioru wyników' gregexpr'a – thelatemail

+0

Tak, to prawda. Jestem clutz regex. –

11

Podstawa R

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

lub używając stringi

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

lub używając stringr

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

1) sub Spróbuj sub ze wskazanego wyrażenia regularnego który bierze najkrótszy ciąg aż cyfra, cyfra a następnie wszystko następujące i zastępuje je cyfrą:

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

podając:

[1] "3" 

Działa to również w przypadku string jest wektorem strun.

2) strapplyc byłoby również możliwe wykorzystanie strapplyc z gsubfn w takim przypadku mogą być wykorzystane jeszcze prostsze wyrażenie regularne:

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

dając tym samym lub korzystać z tego co daje tę samą odpowiedź ponownie ale działa również jeśli string jest wektorem strun:

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

Get rozmieszczenie cyfr

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

Ekstrakt pierwsza cyfra

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

Stosując RegExpr prostsze

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

Lub po prostu użyj 'regexpr', które zwróci tylko pierwsze trafienie [0-9]. – thelatemail

+0

Tak, regexpr jest lepszy – user3969377

0

gsub rozwiązanie, które opiera się na zastąpienie podciągów poprzedzające i następujące po pierwszej cyfry pustym wyrażenie:

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

Korzystanie z rex może uprościć ten typ zadania.

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

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

#> first_number 
#> 1   3 
#> 2   4 
Powiązane problemy