我正试图在R字符串列表中修剪尾部方括号,内引号和斜杠,最好使用dplyr
。
样本数据:
df <- c("['Mamie Smith']", "["Screamin' Jay Hawkins"]")
预期结果:
"Mamie Smith", "Screamin' Jay Hawkins"
我已经试过了:
gsub("[[]]", "", df) # Throws error
df %>%
str_replace("[[]]", "") # Also throws error
在base R中,我们可以使用trimws
函数:
如果我们对非单词部分不感兴趣:
trimws(df, whitespace = "\W+")
[1] "Mamie Smith" "Screamin' Jay Hawkins"
但是如果我们只对删除方括号和引号而留下其他标点符号,空格等感兴趣,那么:
trimws(df, whitespace = "[\]\["']+")
[1] "Mamie Smith" "Screamin' Jay Hawkins"
另一个相对简单的正则表达式解决方案是:
data.frame(df) %>%
mutate(df = gsub("\[\W+|\W+\]", "", df))
df
1 Mamie Smith
2 Screamin' Jay Hawkins
这里我们删除任何出现一次或多次的非字母数字字符(\W+
),条件是它在or (|
)之前,后跟一个方括号。
或者,借用@TaerJae,但大大简化:
library(stringr)
data.frame(df) %>%
mutate(df = str_extract(df, '\w.*\w'))
这里我们只关注字符串两侧的字母数字字符(\w
),同时允许在它们之间出现任何字符(.*
),从而捕获Screamin'
中的撇号和空格。
Base R:
sapply(regmatches(df, regexec('(\w.*)(.*\w)', df)), "[", 1)
[1] "Mamie Smith" "Screamin' Jay Hawkins"
或
我们可以使用stringr
包中的str_extract
和以下正则表达式:
library(stringr)
str_extract(df, '(\w.*)(.*\w)')
[1] "Mamie Smith" "Screamin' Jay Hawkins"
要将方括号与相应的引号类型配对,可以使用:
[(["'])(.*?)1]
[
匹配[
(["'])
Capture组1,捕获"
或'
(.*?)
Capturegroup 2,匹配尽可能少的字符1
对组1的反向引用以匹配相同类型的引用]
匹配]
在替换中使用\2
捕获组2的值Regex demo | R demo
df <- c("['Mamie Smith']", "["Screamin' Jay Hawkins"]")
gsub("\[(["'])(.*?)\1]", "\2", df)
输出[1] "Mamie Smith" "Screamin' Jay Hawkins"
由于[
,]
和"
是特殊字符,您需要用双反斜杠'转义'\
Alt代码:
gsub('\"|\[|\]', "", df)
当在[]
中查找]
时,它需要放在首位[]]
或在其他地方转义。在"["]"
或'["]'
内部使用时,用于字符串的引号需要转义。在示例字符串中没有斜杠(这里它们只是转义"
)。
gsub("[]['"]", "", df)
#[1] "Mamie Smith" "Screamin Jay Hawkins"
避免转义"
或'
的另一个选择是使用原始字符常量r"(...)"
。
gsub(r"([]["'])", "", df)
#[1] "Mamie Smith" "Screamin Jay Hawkins"
要将搜索限制在边界^
(开始)和$
(结束)需要给定。
gsub("^[]['"]*|[]['"]*$", "", df)
#[1] "Mamie Smith" "Screamin' Jay Hawkins"
或trimws
都可以。
trimws(df, "both", "[]['"]")
#[1] "Mamie Smith" "Screamin' Jay Hawkins"