gpt4 book ai didi

regex - 从 R 中的列表中替换除特定正则表达式之外的所有内容

转载 作者:行者123 更新时间:2023-12-01 07:18:25 26 4
gpt4 key购买 nike

我想替换与给定模式不匹配的列表中的所有内容。我正在使用 R 版本 3.1.3 (2015-03-09) -- "Smooth Sidewalk"

我的示例列表是:

y <- c("D CCNA_01234 This is example 1 bis", "D CCNA_02345 This is example 2", "D CCNA_12345 This is example 3", "D CCNA_23468 This is example 4")

我想要匹配的模式是 CCNA_01234,其中每种情况下的数字都不相同,但始终是 5 位数字。

所需的输出是:
"CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

到目前为止,我已经通过以下方式删除了比赛的前一部分:
y_begin_rm <- sub("D ", "", y)

但我在识别与 [^match] 表达式的匹配时遇到问题。
y_CCNA_numbers <- sub("[^CCNA_[0-9][0-9][0-9][0-9][0-9]]*$", "", y_begin_rm)

产生输出:
[1] "CCNA_01234 This is example 1 bis" "CCNA_02345 This is example 2"
[3] "CCNA_12345 This is example 3" "CCNA_23468 This is example 4"

似乎问题是匹配中指定的数字完全是通过字符串查看的,而不是我想要的确切组合。所以“这是例子”后面的数字很麻烦。当我省略数字或放置一个仅在 CCNA_string 之后的数字时,它工作得很好:
y_CCNA <- sub("[^CCNA_]*$", "", y_begin_rm)

结果在
[1] "CCNA_" "CCNA_" "CCNA_" "CCNA_"

或者
y_CCNA_0 <- sub("[^CCNA_0]*$", "", y_begin_rm[1])

结果是
[1] "CCNA_0"

有没有办法指定我正在寻找的确切模式(CCNA_[0-9][0-9][0-9][0-9][0-9])?另外,有没有可能的方法可以一步完成(在单个正则表达式中删除匹配之前和之后)?

提前致谢!

最佳答案

这里有几个方法:

1) 绑带 .这使用了一个特别简单的模式。它利用了 strapplyc在 gsubfn 包中:

library(gsubfn)
strapplyc(y, "CCNA_\\d{5}", simplify = TRUE)
## [1] "CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

这是正则表达式的可视化:
CCNA_\d{5}

Regular expression visualization

Debuggex Demo

1a) 如果 CCNA_ 的唯一出现在 5 位数字之前,那么我们可以像这样稍微简化以前的解决方案:
strapplyc(y, "CCNA_.{5}", simplify = TRUE)
## [1] "CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

2)子 .这里的模式稍微复杂一些,但使用 sub我们可以在没有任何插件包的情况下做到这一点:
sub(".*(CCNA_\\d{5}).*", "\\1", y)
## [1] "CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

3)strsplit 如果想要的部分始终是第二个“单词”(在问题中就是这种情况),那么这将起作用并且再次不需要包:
sapply(strsplit(y, " "), "[", 2)
## [1] "CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

4) substr 如果所需的部分始终是问题中的字符 3 到 12,那么我们可以使用 substrsubstring ,再次,没有任何包:
substr(y, 3, 12)
## [1] "CCNA_01234" "CCNA_02345" "CCNA_12345" "CCNA_23468"

关于regex - 从 R 中的列表中替换除特定正则表达式之外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30014085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com