2016-01-05 30 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'呢? –