仅删除前N个字符中的任何数字

Seb*_*ian 9 regex r

我正在寻找一个正则表达式来捕获字符串中前7个字符的所有数字.

这个字符串有12个字符:

A12B345CD678
Run Code Online (Sandbox Code Playgroud)

我想删除A,B因为他们在前7个字符(A12B345)内得到

12345CD678
Run Code Online (Sandbox Code Playgroud)

所以,CD678不应该触及.我目前在R的解决方案:

paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep="??") 
Run Code Online (Sandbox Code Playgroud)

这似乎太复杂了.我按照描述将字符串拆分为7,匹配前7个字符中的任何数字,并将其与字符串的其余部分绑定.

寻找一般答案,我目前的解决方案是拆分前7个字符,并匹配此子字符串中的所有数字.

任何帮助赞赏.

Wik*_*żew 14

您可以使用已知的SKIP-FAIL正则表达式技巧来匹配从第8个字符开始的所有其余字符串,并且只匹配前7个中的非数字字符和lookbehind:

s <- "A12B345CD678"
gsub("(?<=.{7}).*$(*SKIP)(*F)|\\D", "", s, perl=T)
## => [1] "12345CD678"
Run Code Online (Sandbox Code Playgroud)

请参阅IDEONE演示

perl=T需要此正则表达式的工作.正则表达式细分:

  • (?<=.{7}).*$(*SKIP)(*F)- 匹配除换行符之外的任何字符((?s)如果输入中有换行符号,则在开头添加),尽可能多(.*),直到最后($\\z可能需要删除最终换行符),但前提是7字符(由lookbehind设置(?<=.{7})).该(*SKIP)(*F)动词使发动机省略了整个匹配的文本,并在该文本的末尾推进正则表达式索引的位置.
  • | - 要么...
  • \\D - 非数字字符.

请参阅正则表达式演示.

  • 很棒的想法开箱即用Stribiżew! (2认同)

edd*_*ddi 5

正则表达式解决方案很酷,但我会使用更容易阅读的东西来保持可维护性.例如

library(stringr)

str_sub(s, 1, 7) = gsub('[A-Z]', '', str_sub(s, 1, 7))
Run Code Online (Sandbox Code Playgroud)