1

我想在右边的第三个空白处拆分一系列字符串。空格的数量因字符串而异,但每个字符串至少有三个空格。这是两个示例字符串。

strings <- c('abca eagh   ijkl mnop', 'dd1 ss j, ll bb aa')

我想:

[1] 'abca', 'eagh   ijkl mnop' 
[2] 'dd1 ss j,', 'll bb aa'

我能来的最接近的是:

strsplit(strings, split = "(?<=\\S)(?=\\s(.*)\\s(.*)\\s(.*)$)", perl = TRUE)

返回:

[[1]]
[1] "abca"         " eagh"        "   ijkl mnop"

[[2]]
[1] "dd1"       " ss"       " j,"       " ll bb aa"

我一直认为答案应该是这样的:

strsplit(strings, split = "(?<=\\S\\s(.*)\\s(.*)\\s(.*)$)(?=\\s(.*)\\s(.*)\\s(.*)$)", perl = TRUE)

但是,这会返回错误。谢谢你的任何建议。我更喜欢基本的解决方案,希望是使用正则表达式的解决方案。

4

2 回答 2

3

试试这个表达式:

(?=(?>\\s\\S*){3}$)\\s

编辑:如果您希望将连续的空白字符视为“一个”空白,请使用此表达式:

(?=(?>\\s+\\S*){3}$)\\s

值得注意的是,您的表达式导致错误的原因很可能是因为大多数正则表达式引擎不允许可变宽度的lookbehinds。在您的示例中,这将是*违反规则的追溯中的量词。

知道了!抱歉,我不是 100% 了解 strsplit 函数的工作原理。试试这个:

strsplit(strings, split = "(?=(?>\\s+\\S*){3}$)\\s", perl = TRUE)

这是一个示例输出:

> strings <- c('abca eagh   ijkl mnop', 'dd1 ss j, ll bb aa')
> strsplit(strings, split = "(?=(?>\\s+\\S*){3}$)\\s", perl = TRUE)
[[1]]
[1] "abca"             "eagh   ijkl mnop"

[[2]]
[1] "dd1 ss j," "ll bb aa" 
于 2014-02-20T10:11:59.510 回答
1

如何使用以下正则表达式:(\S*\s*\S*\s*\S*\s*)(.*)?见http://regex101.com/r/lI7aA9

于 2014-02-20T10:13:31.530 回答