【问题标题】:Split string using space and capital letter使用空格和大写字母拆分字符串
【发布时间】:2018-12-13 21:48:48
【问题描述】:

我正在尝试将我的字符串拆分为多行。字符串如下所示:

x <- c("C 10.1 C 12.4","C 12", "C 45.5 C 10")  

代码sn-p:

strsplit(x, "//s")[[3]]

结果:

"C 45.5 C 10"

预期输出:将字符串拆分为多行,如下所示:

"C 10.1"
"C 12.4"
"C 12"
"C 45.5"
"C 10" 

问题是如何拆分字符串?

提示:在我们的例子中,有一个空格,然后是字符“C”。谁知道怎么弄?

【问题讨论】:

  • 您的预期输出是什么?在向量的上下文中提及行有点奇怪。

标签: r regex string split


【解决方案1】:

一个更复杂但在正则表达式方面更容易的表达式:

unlist(
  sapply(
    strsplit(x, " ?C"),
    function(x) {
      paste0("C", x[nzchar(x)])
    }
  )
)
"C 10.1" "C 12.4" "C 12"   "C 45.5" "C 10"  

【讨论】:

  • 有趣。您还可以将 ? 更改为 * 以匹配任何 0+ 个空格,甚至可以将 \\s* 更改为匹配任何 0+ 个空格字符。
  • 谢谢。我想知道哪个被认为是最佳实践。期待了解更多关于正则表达式的信息。
  • 我建议看看Mastering Quantifiers。请注意,在人工编写的文本中,空格可能是任意的,并且可能会丢失,还有拼写错误等。所以最好使用\s* 来确保我们匹配 0、1、2 等。 .由于可能会出现硬空格和软空格,因此使用[[:space:]] POSIX 字符类或将(*UCP)\s 与PCRE 正则表达式(perl=TRUE)一起使用可能会更好。
【解决方案2】:

你可以使用

unlist(strsplit(x, "(?<=\\d)\\s+(?=C)", perl=TRUE))

输出:

[1] "C 10.1" "C 12.4" "C 12"   "C 45.5" "C 10" 

查看online R demoregex demo

(?&lt;=\\d)\\s+(?=C) 正则表达式匹配 1 个或多个空格字符 (\\s+),其前面紧跟一个数字 ((?&lt;=\\d)),后面紧跟 C

如果C 可以是任何大写ASCII 字母,请将C 替换为[A-Z]

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2011-05-28
    • 1970-01-01
    • 2018-05-10
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2021-03-10
    相关资源
    最近更新 更多