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

时间:2016-02-15 13:15:28

标签: regex r

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

此字符串包含12个字符:

A12B345CD678

我想删除AB,因为它们位于前7个字符(A12B345)内并且

12345CD678

因此,不应触及CD678。我目前在R的解决方案:

paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep="‌​") 

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

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

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:14)

您可以使用已知的SKIP-FAIL regex trick来匹配从第8个字符开始的所有字符串的其余部分,并且只匹配前7个字符串中的非数字字符与lookbehind:

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

请参阅IDEONE demo

此正则表达式需要perl=T才能正常工作。正则表达式分解:

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

请参阅regex demo

答案 1 :(得分:5)

正则表达式解决方案很酷,但我会使用更易于阅读的内容来实现可维护性。 E.g。

library(stringr)

str_sub(s, 1, 7) = gsub('[A-Z]', '', str_sub(s, 1, 7))

答案 2 :(得分:2)

你也可以使用一个简单的负面观察:

s <- "A12B345CD678"
gsub("(?<!.{7})\\D", "", s, perl=T)