【问题标题】:R: Trim whitespace within bracketsR:修剪括号内的空白
【发布时间】:2023-03-23 21:07:01
【问题描述】:

括号内的空格如何修剪?

x <- c("the li7(li7, p)b13 reaction")

在这种特殊情况下,它应该只删除逗号和 p 之间的空格,但我正在寻找一个通用的解决方案。

【问题讨论】:

  • gsub 与适当的正则表达式一起使用。
  • ...一直在努力...
  • 如果只有这一个应用,试试x &lt;- gsub(", p", ",p", x, fixed = TRUE)
  • 不,这是一种模式,不仅仅是这个应用程序;)
  • 并且模式总是括号内的空格?

标签: r trim


【解决方案1】:
cases <-c(
  "(a,b)",
  "(a, b)",
  "( a, b)",
  "a(a, b)",
  "a (a, b)",
  "a (a, b) a(a,b) a(a,b )"
)

gsub("[[:space:]](?=[^()]*\\))", "", cases, perl = TRUE)
[1] "(a,b)"                 "(a,b)"                 "(a,b)"                
[4] "a(a,b)"                "a (a,b)"               "a (a,b) a(a,b) a(a,b)"

正则表达式的工作原理如下:当它找到一个空格时,它会向前寻找一个右括号。如果它在途中发现任何其他括号,它会停止并继续移动,直到找到一个没有空格的空格。它用空字符串替换它。

【讨论】:

  • 很好,你能分解那个正则表达式吗?这可以用 regexp 的 R 方式来完成,而你只是更习惯于 perl,还是不使用类似 perl 的 regexp 就不可能?
  • 不,你需要 perl 自带的前瞻功能。
【解决方案2】:

好的,我在stringr-package 中找到了使用str_extract() 的解决方案。

gsub("\\(+.*[[:blank:]]+.*\\)+", 
 gsub("[[:blank:]]", "", 
  str_extract(x, "\\(+.*[[:blank:]]+.*\\)+")),x)

这使用gsub() 搜索括号内有空格的字符串模式,然后使用另一个 gsub 将其替换为提取的不带空格的部分。

编辑:如果括号内的模式包含[[:graph:]]-family 未涵盖的内容,则可能需要更改表达式的那部分。

编辑的编辑:将[[:graph:]] 切换为.,所以这现在应该适用于几乎任何东西。

【讨论】:

  • 非常感谢!我必须说明问题:一个字符串中有多个括号是可能的。就像x &lt;- c("the c13(d, a)b11 and c13(d, t)c12 reactions") 一样,不幸的是,在这种情况下,您提取和替换的技巧不起作用。我们又回到了起点。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2018-08-26
  • 2017-03-16
  • 1970-01-01
  • 2010-11-14
  • 2011-05-07
相关资源
最近更新 更多