首页 > 解决方案 > 正则表达式分组和重新排序

问题描述

恐怕我有一个正则表达式问题。我想提取字符串的第一组,即 1 位,省略第二组,即 2 位,然后提取结尾的 5 位作为第三组。

在我看来,它应该看起来像:str_extract(a, "(\\d{1})(\\d{2})(\\d{5})\\1\\3"). 但这不起作用。

样本数据在这里,也是想要的结果,但表达方式不同:

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  

标签: rregextidyversestringr

解决方案


你做错了。您正在捕获组但不提取这些组。使用字符串替换函数,例如在参数和in 中gsub捕获组,您将获得所需的结果patterngroups referencereplacement argument

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

[1] "133333" "245678" "023456"

推荐阅读