从右侧分割第三个空白区域的字符串

时间:2014-02-20 10:06:36

标签: regex string r strsplit

我想在右边的第三个空格上分割一系列字符串。字符串中的空格数量不尽相同,但每个字符串至少有三个空格。这是两个示例字符串。

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)

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

2 个答案:

答案 0 :(得分:3)

尝试表达式:

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

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

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

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

知道了!对不起,我不是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" 

答案 1 :(得分:1)

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