删除字符串中的尾随括号
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
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"
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
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"