2016-01-05 10 views
2

我有许多可以用下列模式表示的列名称。用R中的正则表达式替换数字前面的字符

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

我想添加一个前面的分隔符例如使用正则表达式的字母和数字字符之间的短划线。

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

我曾尝试以下的正则表达式:

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

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

有人可以帮我一起这个请。

回答

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" 

EDGE办案

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

+0

感谢,这几乎是我所需要的,这是很好的解释。一如既往,边缘情况是问题所在。你知道如何处理'100andover'案件吗?在使用您的示例之前,我可以执行两步gsub并清理它们。尽管如此,一步就很棒。 – John

+0

如果你消除了'$',你会得到如下结果:''女-100andover'''。这是你需要的吗? –

+0

只需一秒钟,是否意味着'Female100andover'应该变成'Female-100andover'?那么'Female100and200over'呢? –