R 中 (x,y) 和 (x,y] 的正则表达式

问题描述 投票:0回答:1

我正在使用 R,并且我有一个 df,其列的 bin 遵循以下两种格式之一:

(x.xx,y.yy] or (x.xx,y.yy)

它们都是具有多个小数的正整数

我想把它们分成

lower upper
x.xx  y.yy

我首先过滤掉 bin 列中的所有 NA(有一些跨多个 dfs):

filter(!is.na(bin))

我目前正在使用这个正则表达式:

mutate(
lower = as.numeric(sub("^[\\(\\[]([0-9.-]+),", "\\1", bin))  
upper = as.numeric(sub(",([0-9.-]+)[\\)\\]]$", "\\1", bin))
)

但它产生所有 NA

我没有尝试过很多替代方案,任何帮助将不胜感激,并提前感谢您

这是一个测试数据示例:

> test_bins <- c("[0.15,0.273]", "(0.273,0.397]", "(0.397,0.52]", "[0.52,0.643]")

> lower_values <- sapply(test_bins, function(x) as.numeric(sub("^[\\[\\(]([0-9.]+),", "\\1", x)))
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In FUN(X[[i]], ...) : NAs introduced by coercion
3: In FUN(X[[i]], ...) : NAs introduced by coercion
4: In FUN(X[[i]], ...) : NAs introduced by coercion

> upper_values <- sapply(test_bins, function(x) as.numeric(sub(",([0-9.]+)[\\)\\]]$", "\\1", x)))
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In FUN(X[[i]], ...) : NAs introduced by coercion
3: In FUN(X[[i]], ...) : NAs introduced by coercion
4: In FUN(X[[i]], ...) : NAs introduced by coercion

> data.frame(test_bins, lower_values, upper_values)
                  test_bins lower_values upper_values
[0.15,0.273]   [0.15,0.273]           NA           NA
(0.273,0.397] (0.273,0.397]           NA           NA
(0.397,0.52]   (0.397,0.52]           NA           NA
[0.52,0.643]   [0.52,0.643]           NA           NA
r regex regex-group
1个回答
0
投票

我怀疑你是从 OpenAI GPT 模型中得到这个:我试图问同样的问题,LLM 给出了非常相似的错误答案。

问题是您使用的

sub
函数没有
perl=TRUE
参数,这意味着该模式是使用默认的 TRE 正则表达式引擎处理的。在 TRE 模式中,括号表达式内的特殊字符无法转义。相反,你需要使用“智能放置”。

此外,您只匹配输入字符串的一部分,所有未匹配的内容都保留在结果字符串中。要使用

sub
“提取”值,您必须匹配整个字符串,因此只需在两个表达式中添加
.*
即可。

如果您想使用自己的正则表达式,则需要按如下方式重新修改它们:

^[([]([0-9.-]+),.*
检测“较低”值,
.*,([0-9.-]+)[])]$
定义较高值。

test_bins <- c("[0.15,0.273]", "(0.273,0.397]", "(0.397,0.52]", "[0.52,0.643]")
lower_values <- as.numeric(sub("^[[(]([0-9.]+),.*", "\\1", test_bins))
upper_values <- as.numeric(sub(".*,([0-9.-]+)[])]$", "\\1", test_bins))
data.frame(test_bins, lower_values, upper_values)
#      test_bins lower_values upper_values
# 1  [0.15,0.273]        0.150        0.273
# 2 (0.273,0.397]        0.273        0.397
# 3  (0.397,0.52]        0.397        0.520
# 4  [0.52,0.643]        0.520        0.643

此处,

[[(]
匹配
[
(
[
不得在方括号表达式内转义),
[])]
匹配
]
)
(当
]
为打开后立即放置
[
,它被解析为文字
]
字符)。

© www.soinside.com 2019 - 2024. All rights reserved.