วิธีที่สั้นกว่าในการแยกตัวเลขชุดสุดท้ายโดยเริ่มจากด้านหลัง

ฉันต้องการแยกตัวเลขชุดสุดท้ายออกจากสตริงโดยไม่ทำเช่นนี้

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

เพราะรูปแบบไม่แน่นอน ฉันรู้ว่า stringi มีฟังก์ชัน str_extract_from_last แต่ฉันต้องยึดติดกับฐาน R หรือ stringR

ขอบคุณ!


person Jantje Houten    schedule 20.04.2021    source แหล่งที่มา
comment
ลอง: sub("^.*?(\\d+).*$", "\\1", "sdkjfn45sdjk54()ad")   -  person GKi    schedule 20.04.2021


คำตอบ (2)


คุณสามารถใช้ regex lookahead เชิงลบได้

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

ใช้ regex เดียวกันในฐาน R :

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

วิธีนี้จะแยกชุดตัวเลขที่ไม่ได้ตามด้วยตัวเลขใดๆ ดังนั้นชุดตัวเลขสุดท้าย

person Ronak Shah    schedule 20.04.2021
comment
ขอบคุณโรนัค! คุณช่วยแนะนำ regex สำหรับสิ่งนี้ - '(\\d+)(?!.*\\d)' ให้ฉันหน่อยได้ไหม - person Jantje Houten; 20.04.2021
comment
(\\d+) คือตัวเลขหนึ่งหลักหรือมากกว่า (?!.*\\d) มากกว่านั้นอีกเล็กน้อย: (?! เป็นการมองไปข้างหน้าเชิงลบ หมายความว่ามีการตรวจสอบและจับคู่ แต่ไม่ได้บันทึกด้วยรูปแบบ (ฉันคิดว่าอาจจำเป็นต้องใช้ $ เช่นเดียวกับใน (?!.*\\d)$ แต่อาจจะไม่) ข้อมูลอ้างอิงที่ดีสำหรับ regex: stackoverflow.com/ a/22944075/3358272 โปรดทราบว่านั่นคือ regex ทั่วไป และ R ต้องใช้แบ็กสแลชคู่เมื่อใดก็ตามที่คำแนะนำนั้นใช้แบ็กสแลชเดี่ยว - person r2evans; 20.04.2021

ใช้ str_extract_all และจับเฉพาะอันสุดท้ายในแต่ละเวกเตอร์

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

ฉันใช้ sapply เพราะฉันเดาว่าคุณมีมากกว่าหนึ่งสาย str_extract_all จะส่งกลับ list โดยที่แต่ละองค์ประกอบเป็นศูนย์หรือมากกว่านั้นที่แยกสตริงจากแหล่งที่มา เนื่องจากเราสนใจเพียงสิ่งเดียว เราจึงใช้ sapply ได้

บางคนอาจถูกล่อลวงให้ใช้ sapply(., tail, 1) แต่ถ้าพบศูนย์ มันจะเป็น character(0) ไม่ใช่ว่างเปล่าหรือ NA ฉันอนุมานว่า NA จะเป็นผลตอบแทนที่ดีเมื่อไม่พบรูปแบบ

person r2evans    schedule 20.04.2021