使用R

时间:2016-01-05 11:54:57

标签: regex r

我有许多列名,可以用以下模式表示。

dat <- c("Male97","Male98","Male99", "Male100andover","Female0","Female1" ,"Female2", "Female3", "Female4" ,"Female5", "Female100andover")

我正在尝试添加前面的分隔字符,例如短信,使用正则表达式在字母和数字字符之间。

我想要的输出是,例如Male-97Female-0。但是,在“100及以上”的情况下,我不希望在数字字符后面插入分隔符。

我尝试过以下正则表达式:

gsub('([e])[0-9]', '-', dat)

它几乎可以工作。我需要一些不能用短划线代替'e'的东西。

有人可以帮助我。

1 个答案:

答案 0 :(得分:4)

您的([e])[0-9]正则表达式匹配捕获e后跟一个数字,即使数字不在字符串的末尾。然后,您只在替换中使用-,因此数字将丢失。您可以尝试使用([0-9])的其他捕获组,但它会更改Male100andover中的值等等。

您可以像这样使用捕获组驱动的正则表达式:

dat <- c("Male97","Male98","Male99", "Male100andover","Female0","Female1" ,"Female2", "Female3", "Female4" ,"Female5", "Female100andover")
gsub("(\\d+)$", "-\\1", dat)

请参阅IDEONE demo

说明:

  • (\\d+) - 匹配并捕获第1组中的一个或多个数字......
  • $ - 在字符串的末尾。

在替换模式中,\1反向引用捕获的数字。

结果:

 [1] "Male-97"          "Male-98"          "Male-99"          "Male100andover"  
 [5] "Female-0"         "Female-1"         "Female-2"         "Female-3"        
 [9] "Female-4"         "Female-5"         "Female100andover"

边缘案件处理

gsub("(\\d+\\D*)$", "-\\1", dat) ## insert before the last digit sequence
## [1] "Male-97"             "Male-98over"         "Male99over-100under"
gsub("^(\\D*)(\\d+)", "\\1-\\2", dat) ## insert before the first digit sequence
## [1] "Male-97"             "Male-98over"         "Male-99over100under"

请参阅another demo