gpt4 book ai didi

regex - 基于正则表达式替换数据框列

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

我正在尝试使用正则表达式提取数据框中列的一部分。我遇到的问题包括 grep返回整个值,而不仅仅是匹配的部分,还有 str_extract似乎不能以矢量化的方式工作。

这是我正在尝试的。我要 df$match显示alpha.alpha.模式存在的地方和 NA除此以外。如何只显示匹配的部分?

另外,我该如何更换 [a-zA-Z]在 R 正则表达式中?我可以使用字符类或像 [:alpha:] 这样的 POSIX 代码吗? ?

v1 <- c(1:4)
v2 <- c("_a.b._", NA, "_C.D._", "_ef_")
df <- data.frame(v1, v2, stringsAsFactors = FALSE)

df$match <- grepl("[a-zA-Z]\\.[a-zA-Z]\\.", df$v2)
df$match

#TRUE FALSE TRUE FALSE

v2grep <- grep("[a-zA-Z]\\.[a-zA-Z]\\.", df$v2, value = TRUE)

df$match[df$match == TRUE] <- v2grep
df$match[df$match == FALSE] <- NA

df

#v1 v2 match
#1 _a.b._ _a.b._
#2 <NA> <NA>
#3 _C.D._ _C.D._
#4 _ef_ <NA>

我想要的是:
#v1  v2      match
#1 _a.b._ a.b.
#2 <NA> <NA>
#3 _C.D._ C.D.
#4 _ef_ <NA>

最佳答案

4种方法...

这是 base 和 rm_default(extract=TRUE) 中的 2 种方法在 qdapRegex 我维护的包和 stringi 包裹。

unlist(sapply(regmatches(df[["v2"]], gregexpr("[a-zA-Z]\\.[a-zA-Z]\\.", df[["v2"]])), function(x){
ifelse(identical(character(0), x), NA, x)
})
)

## [1] "a.b." NA "C.D." NA

pat <- "(.*?)([a-zA-Z]\\.[a-zA-Z]\\.)(.*?)$"
df[["v2"]][!grepl(pat, df[["v2"]])] <- NA
df[["v2"]] <- gsub(pat, "\\2", df[["v2"]])

## [1] "a.b." NA "C.D." NA

library(qdapRegex)
unlist(rm_default(df[["v2"]], pattern = "[a-zA-Z]\\.[a-zA-Z]\\.", extract = TRUE))

## [1] "a.b." NA "C.D." NA

library(stringi)
stri_extract_first_regex(df[["v2"]], "[a-zA-Z]\\.[a-zA-Z]\\.")

## [1] "a.b." NA "C.D." NA

关于regex - 基于正则表达式替换数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529021/

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