Cara yang lebih singkat untuk mengekstrak kumpulan digit terakhir mulai dari belakang

Saya ingin mengekstrak kumpulan digit terakhir dari sebuah string tanpa melakukan ini.

"sdkjfn45sdjk54()ad"

str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$")
[1] "sdkjfn45sdjk54()"

str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\\(")
[1] "sdkjfn45sdjk54)"

str_remove(str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\\("), "\\)")
[1] "sdkjfn45sdjk54"

str_extract(str_remove(str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\\("), "\\)"), "\\d+$")
[1] "54"

karena polanya tidak pasti. Saya sadar bahwa stringi memiliki fungsi str_extract_from_last tetapi saya harus tetap menggunakan basis R atau stringR.

Terima kasih!


person Jantje Houten    schedule 20.04.2021    source sumber
comment
Coba: sub("^.*?(\\d+).*$", "\\1", "sdkjfn45sdjk54()ad")   -  person GKi    schedule 20.04.2021


Jawaban (2)


Anda dapat menggunakan ekspresi reguler lookahead negatif.

string <- "sdkjfn45sdjk54()ad"
stringr::str_extract(string, '(\\d+)(?!.*\\d)')
#[1] "54"

Menggunakan regex yang sama di basis R :

regmatches(string, gregexpr('(\\d+)(?!.*\\d)', string, perl = TRUE))[[1]]

Ini mengekstrak kumpulan angka yang tidak diikuti oleh angka apa pun, jadi kumpulan angka terakhir.

person Ronak Shah    schedule 20.04.2021
comment
Terima kasih Ronak! Bisakah Anda memandu saya melalui regex untuk ini - '(\\d+)(?!.*\\d)'? - person Jantje Houten; 20.04.2021
comment
(\\d+) adalah satu atau lebih digit. (?!.*\\d) sedikit lebih: (?! adalah pandangan ke depan negatif, artinya dicentang dan dicocokkan, tetapi tidak ditangkap dengan polanya. (Saya pikir $ mungkin diperlukan, seperti pada (?!.*\\d)$, tapi mungkin tidak.) Referensi yang bagus untuk regex: stackoverflow.com/ a/22944075/3358272, namun ketahuilah bahwa itu adalah regex generik, dan R memerlukan garis miring terbalik ganda di mana pun panduan tersebut menggunakan garis miring terbalik tunggal. - person r2evans; 20.04.2021

Gunakan str_extract_all dan ambil yang terakhir di setiap vektor.

library(stringr)
quux <- str_extract_all(c("a", "sdkjfn45sdjk54()ad"), "[0-9]+")
sapply(quux, `[`, lengths(quux))
# [1] NA   "54"

Saya menggunakan sapply karena saya rasa Anda memiliki lebih dari satu string. str_extract_all akan mengembalikan list, di mana setiap elemen adalah nol atau lebih string yang diekstraksi dari sumbernya. Karena kita hanya tertarik pada salah satu saja, kita dapat menggunakan sapply.

Seseorang mungkin tergoda untuk menggunakan sapply(., tail, 1), tetapi jika ditemukan nol, maka hasilnya adalah character(0), bukan kosong atau NA. Saya menyimpulkan bahwa NA akan menjadi hasil yang bagus ketika polanya tidak ditemukan.

person r2evans    schedule 20.04.2021