删除字符串中的尾随括号

Remove trailing brackets in a string

R 中字符数据中的 removing/replacing 尾随方括号、内引号和斜线,最好使用 dplyr.

,希望能提供一些帮助

样本:

df <- c("['Mamie Smith']", "[\"Screamin' Jay Hawkins\"]")

我尝试过的:

gsub("[[]]", "", df) # Throws error
df %>%
  str_replace("[[]]", "") # Also throws error

数据应该是什么样的。

"Mamie Smith", "Screamin' Jay Hawkins"

希望得到您的帮助。

基数 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"

因为 []" 是特殊字符,您需要 'escape' 使用双反斜杠 \

这是一些替代代码:

gsub('\"|\[|\]', "", df)

在 base R 中我们可以使用 trimws 函数:

如果我们对非单词部分不感兴趣:

trimws(df, whitespace = "\W+")
[1] "Mamie Smith"           "Screamin' Jay Hawkins"

但是,如果我们只对删除方括号和引号感兴趣,同时保留其他标点符号、空格等,那么:

trimws(df, whitespace = "[\]\[\"']+")
[1] "Mamie Smith"           "Screamin' Jay Hawkins"

要将方括号与随附的引用类型配对,您可以使用:

\[(["'])(.*?)]

说明

  • \[ 匹配 [
  • (["']) 捕获 组 1,捕获 "'
  • (.*?) 捕获 组 2,匹配尽可能少的字符
  • </code> 反向引用第 1 组以匹配相同类型的引用</li> <li><code>] 匹配 ]

在替换中使用捕获组 2 的值使用 \2

Regex demo | R demo

df <- c("['Mamie Smith']", "[\"Screamin' Jay Hawkins\"]")
gsub("\[([\"'])(.*?)\1]", "\2", df)

输出

[1] "Mamie Smith"           "Screamin' Jay Hawkins"

另一个相对简单的正则表达式解决方案是:

data.frame(df) %>%
  mutate(df = gsub("\[\W+|\W+\]", "", df))
                     df
1           Mamie Smith
2 Screamin' Jay Hawkins

在这里,我们删除任何出现一次或多次的 non-alphanumeric 字符 (\W+),条件是它前面有 OR (|),后跟一个方括号。

或者,从@TaerJae 借用但大大简化:

library(stringr)
data.frame(df) %>%
  mutate(df = str_extract(df, '\w.*\w'))

这里我们只关注字符串两边的字母数字字符 (\w),同时允许任何字符 (.*) 出现 in-between,因此捕获,例如,Screamin' 中的撇号和空格。

[] 中寻找 ] 时,它需要在第一位 []] 或在其他地方转义。用于字符串的引号在 "[\"]"'["]' 中使用时需要转义。在示例字符串中没有斜杠(这里它们只是转义 ")。

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"