使用非贪婪正则表达式通过strsplit分割字符串

3

我在使用正则表达式和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: 中,冒号是第一个,而不是第二个,后面跟着一个空格,并且前面有一个字母。请在陈述您的要求时更加精确。 - Cary Swoveland
1
你总是有一个时间戳吗?strsplit(x, '\\d.*?:.*?:\\K', perl = TRUE) - rawr
你的意思是在第一个冒号后面跟着一个空格并且前面有一个字母的位置进行分割吗? - Cary Swoveland
@rawr,我认为你懂了!请将其添加为答案...如果可以的话,你能否为我解释一下正则表达式?我几乎都明白了。非常感谢! - SabDeM
这意味着对于字符串 a:b:c: da: b:c: d,您希望在 bc 之间的冒号上进行拆分。是这样吗?如果是,那么您问题中的斜体从句有什么目的? - Cary Swoveland
显示剩余5条评论
1个回答

2
我们可以将第一个出现的“:”替换为另一个字符,或者直接复制它,然后使用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"

2
谢谢,但我并不总是有Mario,这就是为什么我决定使用[[:alpha:]],这里的字符串只是一个例子。 - SabDeM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接