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

Giả sử tôi có chuỗi ở trên và tôi muốn tìm số đầu tiên trong chuỗi và lưu giá trị của nó. Trong trường hợp này, tôi muốn lưu trữ giá trị 3 (vì đó là chữ số đầu tiên xuất hiện trong chuỗi). grepl("\\d", string) chỉ trả về giá trị lô-gic, nhưng không cho tôi biết bất kỳ điều gì về chữ số đầu tiên ở đâu hoặc chữ số nào. Tôi nên sử dụng cụm từ thông dụng nào để tìm giá trị của chữ số đầu tiên?R: cách tìm chữ số đầu tiên trong một chuỗi

Trả lời

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

Hoặc

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

Vì vậy:

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

Lưu ý rằng một kết quả đầy đủ từ một cuộc gọi gregexpr là một danh sách, vì vậy cần phải giải nén phần tử đầu tiên của mình với "[[" :

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

Cảm ơn. Bây giờ tôi có chỉ mục, làm thế nào tôi có thể trích xuất các chữ số từ chuỗi? 'string [4]' sẽ không hoạt động – Adrian

+0

'regmatches' như được sử dụng bởi câu trả lời của David Arenburg sẽ là phương thức R cơ sở ưa thích của việc trích xuất các kết quả regex từ các chuỗi mà tôi nghĩ. Ngoài ra, 'regexpr' sẽ loại bỏ sự cần thiết phải tập hợp các kết quả của' gregexpr' – thelatemail

+0

Đúng, đó là sự thật. Tôi là một clexz regex. –

11

Cơ sở R

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

Hoặc sử dụng stringi

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

Hoặc sử dụng stringr

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

1) phụ Hãy thử sub với biểu thức chính quy chỉ ra trong đó có chuỗi ngắn nhất đến một chữ số, một chữ số và sau đó mọi thứ tiếp theo và thay thế bằng chữ số:

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

cho:

[1] "3" 

này cũng hoạt động nếu string là một vector của chuỗi.

2) strapplyc Nó cũng sẽ có thể sử dụng strapplyc từ gsubfn trong trường hợp này là một biểu hiện thường xuyên thậm chí còn đơn giản hơn có thể được sử dụng:

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

đưa ra cùng hoặc sử dụng này mang đến cho câu trả lời tương tự một lần nữa mà còn hoạt động nếu string là một vector của chuỗi:

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

Lấy vị trí của các chữ số

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

Extract chữ số đầu tiên

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

Sử dụng regexpr là đơn giản

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

Hoặc chỉ sử dụng 'regexpr', sẽ chỉ trả lại lần truy cập đầu tiên [0-9]. – thelatemail

+0

Có, regexpr tốt hơn – user3969377

0

Một giải pháp gsub đó là dựa trên thay thế các chuỗi con trước và sau chữ số đầu tiên với chuỗi rỗng:

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

Sử dụng rex có thể làm cho loại nhiệm vụ này đơn giản hơn một chút.

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

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

#> first_number 
#> 1   3 
#> 2   4 
Các vấn đề liên quan