由多个分隔符拆分字符串,同时在结果中包含运算符

时间:2016-04-20 17:20:28

标签: regex r

如何通过比较运算符(Start>=8.5Start< 14.5>=<=拆分><等字符串 - 保持结果中的操作员?期望的输出将包括三个元素,例如:

output[1]
Start 

output[2]
>= 
output[3]
8.5

在第二个字符串的情况下:

output[1]
Start

output[2]
<

output[3]
14.5

我尝试了sapply(x, function(x) strsplit(x, ">=|<", perl = TRUE)),但这会删除分隔符。

3 个答案:

答案 0 :(得分:1)

您可以将strsplit与以下PCRE正则表达式一起使用:

strsplit(input, '(?<=[><=])(?=[^><=])|(?<=[^><=])(?=[><=])', perl = TRUE)

请参阅IDEONE demothis regex demo

详细

正则表达式包含2个用OR |管道符号分隔的备选项。第一部分 - (?<=[><=])(?=[^><=]) - 有2个零宽度断言,它们匹配定义的字符类([><=])中的运算符符号与否定字符类中定义的符号之间的空位置([^><=])。第二种替代方案匹配属于运算符类的字符之外的字符与执行的字符之间的空位置。因此,实际上,我们匹配运营商之前和之后的2个位置。

替代解决方案基于 stringr str_match_all

> library(stringr)
> input <- c("Start>=8.5","Start< 14.5","x == 4","tmp >= 7","ff =11","x<=2")
> output <- str_match_all(input, "([^=<>]*?)\\s*([<>=]+)\\s*(.*)")

请参阅regex demo([^=<>]*?)\\s*([<>=]+)\\s*(.*)模式有3个捕获组,用于捕获运算符(([^=<>]*?))之前的部分,运算符本身(([<>=]+)),然后它后面是什么((.*))。

答案 1 :(得分:0)

这个正则表达式似乎有用

([^\s<>=]*)\s*(?=[><=]+)(.*)(?<=[><=])\s*(.[^\s<>=]*)

<强> Regex Demo

R代码

input <- c("Start>=8.5","Start< 14.5","x == 4","tmp >= 7","ff =11","x<=2")
splitted<-strsplit(gsub("([^\\s<>=]*)\\s*(?=[><=]+)(.*)(?<=[><=])\\s*(.[^\\s<>=]*)", "\\1 \\2 \\3", input, perl=T), " ")
splitted

<强> Ideone Demo

答案 2 :(得分:0)

我只是做一个全局搜索 - 把它变成一个数组。

((?:<=?|>=?)|(?:(?!<=?|>=?).)+)
(捕获组是可选的)

扩展

 (                             # (1 start)
      (?: <=? | >=? )
   |  
      (?:
           (?! <=? | >=? )
           . 
      )+
 )                             # (1 end)