如何通过比较运算符(Start>=8.5
,Start< 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))
,但这会删除分隔符。
答案 0 :(得分:1)
您可以将strsplit
与以下PCRE正则表达式一起使用:
strsplit(input, '(?<=[><=])(?=[^><=])|(?<=[^><=])(?=[><=])', perl = TRUE)
请参阅IDEONE demo和this 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)