我有许多列名,可以用以下模式表示。
dat <- c("Male97","Male98","Male99", "Male100andover","Female0","Female1" ,"Female2", "Female3", "Female4" ,"Female5", "Female100andover")
我正在尝试添加前面的分隔字符,例如短信,使用正则表达式在字母和数字字符之间。
我想要的输出是,例如Male-97
或Female-0
。但是,在“100及以上”的情况下,我不希望在数字字符后面插入分隔符。
我尝试过以下正则表达式:
gsub('([e])[0-9]', '-', dat)
它几乎可以工作。我需要一些不能用短划线代替'e'的东西。
有人可以帮助我。
答案 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