Saya khawatir saya punya pertanyaan regex. Saya ingin mengekstrak grup pertama dari sebuah string, yaitu 1 digit, tinggalkan grup ke-2, yaitu 2 digit, dan kemudian ekstrak 5 digit akhir sebagai grup ke-3.

Menurut pendapat saya itu akan terlihat seperti: str_extract(a, "(\\d{1})(\\d{2})(\\d{5})\\1\\3"). Tapi itu tidak berhasil.

Data sampel ada di sini dan juga hasil yang diinginkan, tetapi dengan ekspresi yang berbeda:

library(tidyverse)

d <- tibble(a = as.character(as.integer(runif(10, 1e8, 2e8))) )

d %>%
  mutate(want_but_wrong_regex = str_remove(a, "(?<=\\d)\\d{2}")) # 

# A tibble: 10 x 2
#a         want_but_wrong_regex
#<chr>     <chr>               
#  1 103016397 1016397             
#2 164356395 1356395             
#3 134615352 1615352             
#4 176581897 1581897             
#5 127035705 1035705             
#6 158055182 1055182             
#7 193991176 1991176             
#8 147845896 1845896             
#9 177083273 1083273             
#10 129086338 1086338  
1
r.user.05apr 27 Mei 2021, 11:01

3 jawaban

Jawaban Terbaik

Saya pikir apa yang Anda cari adalah str_replace, bukan str_extract (terima kasih data dummy @AnilGoyal), yaitu,

> str_replace(strings, "(\\d{1})(\\d{2})(\\d{5})", "\\1\\3")
[1] "133333" "245678" "023456"
2
ThomasIsCoding 27 Mei 2021, 08:16

Karena posisinya sudah diperbaiki mengapa Anda tidak mengekstrak string menggunakan substring atau fungsi serupa alih-alih regex ? Mereka biasanya lebih cepat daripada ekstraksi regex.

library(dplyr)
library(stringr)

d %>% mutate(res = str_c(str_sub(a, 1, 1), str_sub(a, 4, 9)))

#.          a     res
#1  103016397 1016397
#2  164356395 1356395
#3  134615352 1615352
#4  176581897 1581897
#5  127035705 1035705
#6  158055182 1055182
#7  193991176 1991176
#8  147845896 1845896
#9  177083273 1083273
#10 129086338 1086338

Atau di basis R -

transform(d, res = paste0(substr(a, 1, 1), substr(a, 4, 9)))
2
Ronak Shah 27 Mei 2021, 09:39

Anda melakukannya dengan cara yang salah. Anda menangkap grup tetapi tidak mengekstraknya. Gunakan fungsi substitusi string seperti gsub dengan menangkap grup dalam argumen pattern dan groups reference di replacement argument dan Anda akan mendapatkan hasil yang diinginkan

strings <- c('12233333', '23345678', '00123456')
gsub('(\\d{1})(\\d{2})(\\d{5})', '\\1\\3', strings)

[1] "133333" "245678" "023456"
2
AnilGoyal 27 Mei 2021, 08:05