按照 R 语言中的减号和加号将字符串分成多个部分

5
我想将这个字符串拆分成R中的加减部分。 test =“-1x ^ 2 + 3x ^ 3-x ^ 8 + 1-x” ...通过加号和减号字符进行。 我的目标是获得: “-1x ^ 2”“+ 3x ^ 3”“-x ^ 8”“+ 1”“-x”。
以下方法不起作用:
strsplit(test, split = "-")
strsplit(test, split = "+")
4个回答

7
我们可以在strsplit中提供一个正则表达式,其中我们使用?=向前查找加号或减号,并在该字符上进行拆分。这将允许字符本身被保留而不是在拆分中被丢弃。
strsplit(x, "(?<=.)(?=[+])|(?<=.)(?=[-])",perl = TRUE)

# [1] "-1x^2" "+3x^3" "-x^8"  "+1"    "-x"   

1
你可能需要解释一下逻辑是什么。我的理解是,Stack Overflow有一个反对仅包含代码的答案的规定。 - IRTFM

5

这里使用gsub查找任何后面带有+或-的字符,并在这两个字符之间插入一个分号。然后按分号拆分。

s <- "-1x^2+3x^3-x^8+1-x"
strsplit(gsub("(.)([+-])", "\\1;\\2", s), ";")[[1]]
## [1] "-1x^2" "+3x^3" "-x^8"  "+1"    "-x"   

5

尝试

> strsplit(test, split = "(?<=.)(?=[+-])", perl = TRUE)[[1]]
[1] "-1x^2" "+3x^3" "-x^8"  "+1"    "-x"

(?<=.)(?=[+-]) 捕获了位于 +- 前面的分隔符。


同意我对安德鲁的评论。 - IRTFM

4
在您的例子中,您使用strsplit加上和减号将在每次遇到时进行拆分。
您可以断言直接左侧的内容不是字符串的开头,也不是 +-,同时直接断言右侧的内容为 +-
(?<!^|[+-])(?=[+-])

解释

  • (?<! 负向后瞻断言
    • ^ 字符串的开头
    • | 或者 - [+-] 使用字符类匹配+-
  • ) 关闭负向后瞻
  • (?= 正向前瞻断言
    • [+-] 匹配+-
  • ) 关闭正向前瞻

由于该模式使用了lookaround断言,您需要使用perl = T来使用Perl风格的正则表达式。

例子

test <- "-1x^2+3x^3-x^8+1-x"
strsplit(test, split = "(?<!^|[\\s+-])(?=[+-])", perl = T)

输出

[[1]]
[1] "-1x^2" "+3x^3" "-x^8"  "+1"    "-x"  

查看在线的R演示


如果左侧没有空格,也可以将模式写为

(?<!^|[\\s+-])(?=[+-])

查看正则表达式演示


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