【问题标题】:Split string with non greedy regex via strsplit通过 strsplit 使用非贪婪正则表达式拆分字符串
【发布时间】:2020-08-24 13:02:21
【问题描述】:

我遇到了正则表达式和 strsplit 的问题。我想根据第二个: 符号拆分以下x 字符串

x <- "26/11/19, 22:16 - Super Mario: It's a me: Super Mario!, but also : the princess"

然后获得类似的东西

"26/11/19, 22:16 - Super Mario"
" It's a me: Super Mario!, but also : the princess"

我正在使用 strsplit 和以下正则表达式,根据我的小知识,应该像 “只选择冒号符号后跟一个空格并且前面只有字母”.

我尝试使用 ? 符号使正则表达式不贪心,但显然我遗漏了一些东西,结果无法按预期工作,因为它在拆分操作中还包含 me:

我认为有一个非贪婪的运算符很重要,因为这里的字符串只是一个例子,当然我并不总是有 Mario 这个词。

strsplit(x, "(?<=[[:alpha:]]):(?= )", perl = TRUE)

谢谢你!

【问题讨论】:

  • 我很困惑。 Mario: 中的冒号是第一个,而不是第二个冒号,后跟一个空格,前面是一个字母。请更准确地说明您的要求。
  • 你总是有时间戳吗? strsplit(x, '\\d.*?:.*?:\\K', perl = TRUE)
  • 你的意思是在第一个冒号上拆分,后面跟一个空格,前面是一个字母?
  • @rawr 我想你明白了!请添加它作为答案......如果我可以问,你能告诉我正则表达式吗?我得到(几乎)所有这些。非常感谢!
  • @SabDeM 我不相信它,它可能会在某些示例中崩溃。它匹配一个数字后跟两个冒号然后重置,所以如果第二个冒号后面有一个数字,它将不起作用。如果没有\\d,它将在每两个冒号后拆分。我不知道足够的正则表达式来解决这个问题

标签: r regex strsplit


【解决方案1】:

我们可以将第一次出现的 ':' 替换为另一个字符,或者直接复制它然后使用 strsplit

strsplit(sub("([[:alpha:]]):", "\\1::", x),
       "(?<=[[:alpha:]]):{2,}(?= )", perl = TRUE)[[1]]
#[1] "26/11/19, 22:16 - Super Mario"       
#[2] " It's a me: Super Mario!, but also : the princess"

str_split

library(stringr)
str_split(x, "(?<=[[:alpha:]]):(?= )", n = 2)[[1]]
#[1] "26/11/19, 22:16 - Super Mario"   
#[2] " It's a me: Super Mario!, but also : the princess"

【讨论】:

  • 谢谢,但我并不总是马里奥,这就是为什么我决定使用[[:alpha:]],这里的字符串只是一个例子。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2012-01-05
  • 2011-04-27
  • 2010-10-20
相关资源
最近更新 更多