在数字和特殊字符条件R之间添加空格

时间:2019-01-11 16:27:09

标签: r regex stringr stringi

我正在尝试使用 stringr 或R base调用有条件地为大型矢量中的实例添加空格,该矢量中有一个数值然后是一个特殊字符-在这种情况下为$标志没有空格。 str_pad 似乎不允许参考矢量。

例如,针对:

  

$ 6.88 $ 7.34

我想在最后一个数字之后和下一个美元符号之前添加一个空格:

  

$ 6.88 $ 7.34

谢谢!

2 个答案:

答案 0 :(得分:2)

如果只有一个实例,则使用sub分别捕获数字和$,并在替换中在捕获的组的反向引用之间添加空格

sub("([0-9])([$])", "\\1 \\2", v1)
#[1] "$6.88 $7.34"

或者使用正则表达式环视

gsub("(?<=[0-9])(?=[$])", " ", v1, perl = TRUE)

数据

v1 <- "$6.88$7.34"

答案 1 :(得分:0)

如果使用向量字符串,此方法将起作用:

mystring<-as.vector('$6.88$7.34 $8.34$4.31')

gsub("(?<=\\d)\\$", " $", mystring, perl=T)

[1] "$6.88 $7.34 $8.34 $4.31"

这包括已经有空间的情况。

关于评论中提出的问题:

mystring2<-as.vector('Regular_Distribution_Type† Income Only" "Distribution_Rate 5.34%" "Distribution_Amount $0.0295" "Distribution_Frequency Monthly')

gsub("(?<=[[:alpha:]])\\s(?=[[:alpha:]]+)", "_", mystring2, perl=T)

[1] "Regular_Distribution_Type<U+2020> Income_Only\" \"Distribution_Rate 5.34%\" \"Distribution_Amount $0.0295\" \"Distribution_Frequency_Monthly"

请注意,\的出现是由于矢量中的嵌套引号引起的,不应有任何区别。由于对特殊字符进行了编码,因此<U+2020>也会出现。

正则表达式的解释:

(?<=[[:alpha:]])的第一部分是?<=创建的正向后看,基本上是在我们尝试匹配的所有内容的后面,以确保我们在后看中定义的内容在那里。在这种情况下,我们正在寻找与字母字符匹配的[[:alpha:]]

然后我们用\s检查空格,在R中我们必须使用双转义符,因此\\s,这就是我们要匹配的内容。

最后,我们使用(?=[[:alpha:]]+),这是?=定义的正向超前检查,检查以确保我们的匹配项后跟有另一个字母,如上所述。

逻辑是在字母之间找到一个空格,然后用_

匹配该空格,然后将该空格替换为gsub。

查看所有正则表达式here