【问题标题】:Add a white-space between number and special character condition R在数字和特殊字符条件 R 之间添加一个空格
【发布时间】:2019-06-06 14:35:33
【问题描述】:

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

例如,对于:

$6.88$7.34

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

$6.88 $7.34

谢谢!

【问题讨论】:

标签: r regex stringr stringi


【解决方案1】:

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

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

或使用正则表达式环视

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

数据

v1 <- "$6.88$7.34"

【讨论】:

  • 谢谢!太有用了!
  • 嗨,我遇到了一个边缘情况,我需要查看“%”后面的一系列字符串的左侧并添加一个空格。这是一个示例:$6.57-10.59% 这可以为以下内容添加一个空格: gsub("(?=[-])", " ", test9, perl = TRUE) 但是如果 % 值为正,有时它可以是个位数或两位数,不包括十进制 - 字符串不会添加适当的空格。知道如何做到这一点吗?
  • 以下是 $6.5910.57% 或 $6.599.40% 的情况示例。不幸的是,我不能总是数到 $ 的右侧或 % 的左侧来添加空间。也许我可以尝试在小数点右边添加一个空格?
  • @js80 是不是一直向右两位数。如果它也是个位数,那么它会在理解新数字的开始位置方面产生问题
【解决方案2】:

如果您使用矢量字符串,这将起作用:

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"

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

关于 cmets 中提出的问题:

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"

请注意,\ 由于向量中的嵌套引号而出现,不应有所作为。由于编码特殊字符,还会出现&lt;U+2020&gt;

正则表达式解释:

(?&lt;=[[:alpha:]]) 这第一部分是由?&lt;= 创建的积极的后视,这基本上是在我们试图匹配的任何东西的后面,以确保我们在后视中定义的东西在那里。在这种情况下,我们正在寻找与字母字符匹配的[[:alpha:]]

然后我们用\s检查空格,在R中我们必须使用双重转义所以\\s,这就是我们想要匹配的。

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

逻辑是在字母之间找一个空格,匹配空格,然后用gsub替换,换成_

查看所有正则表达式here

【讨论】:

  • 我已经尝试过了,但问题是仅解决数字字符和“$”之间没有空格的情况。向量很长,并且在某些情况下,“$”和数字价格没有格式问题,所以我认为解决方案需要针对我提到的实例进行区分。感谢您的帮助!
  • 清理和重新格式化此向量的相关问题。如何通过将元素 2 和 3 与“_”连接而不影响向量其余部分的结构,仅将元素 2 和 3 与 a 连接? IE。 “收入”和“仅”被视为两个独立的元素,应将其连接起来,同时保持其余部分相同。谢谢!!!
  • 向量总是有两个词只是不一定是这两个所以我不能只做一个简单的str_replace_all。
  • @js80 你介意解释一下单词适合向量的位置吗,到目前为止我唯一的例子是vector&lt;'-$6.88$7.34?'
  • 你明白了!谢谢!