【问题标题】:Split strings on third white space from the right在右侧第三个空白处拆分字符串
【发布时间】:2014-02-20 10:06:36
【问题描述】:

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

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)

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

【问题讨论】:

  • 你可以反转你的字符串,然后在左边第三个空格处拆分反转的字符串(这可能更容易!),然后反转每个子字符串?
  • 第一个例子abca eagh{SPACE}{SPACE}{SPACE}ijkl{SPACE}mnop不应该根据你的要求给你'abca eagh',' ijkl mnop'吗?
  • @JonM 也许我没有正确使用“空白”一词。对于那个很抱歉。我已经包含了字符串和所需的结果。
  • 那么连续的空格是否应该被视为“一个”空格(例如,一行中的 5 个空格应计为一个空格)?
  • 是的,连续 5 个空格被视为一个空格。

标签: regex string r strsplit


【解决方案1】:

试试这个表达式:

(?=(?>\\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" 

【讨论】:

  • 我发现两者都有错误。我正在使用 R。一个错误涉及 \ 作为转义字符。使用 \\ 并不能解决所有错误。
  • 好的,我已经更新了答案。我已经给了它 R 特定的语法。
  • 你是对的!我已经更新了我的答案!我错了,因为我告诉 strsplit 函数在整个字符串处拆分!
【解决方案2】:

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

【讨论】:

  • 这会返回错误。我正在使用 R,它似乎更喜欢 \\ 而不是 \。但是,使用 \\. 后我仍然收到错误
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2020-09-03
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多