删除没有内容的字符串中的括号
Posted
技术标签:
【中文标题】删除没有内容的字符串中的括号【英文标题】:Removing brackets in a string without the content 【发布时间】:2021-12-31 11:51:37 【问题描述】:我想重新排列我拥有的数据。它仅由名称组成,但有些带有括号,我想去掉,保留内容,并在末尾添加 2 个名称。
例如
df <- c ("Do(i)lfal", "Do(i)lferl", "Steff(l)", "Steffe", "Steffi")
我想在最后拥有
df <- c( "Doilfal", "Dolfal", "Doilferl", "Dolferl", "Steff", "Steffl", "Steffe", "Steffi")
我试过了
sub("(.*)(\\([a-z]\\))(.*)$", "\\1\\2, \\1\\2\\3", df)
但它不是很有效
非常感谢
【问题讨论】:
【参考方案1】:df = gsub("[\\(\\)]", "", df)
【讨论】:
【参考方案2】:你犯了两个小错误:
在第一种情况下,您需要 \1\2\3,因为您需要所有字母。它是您想要的第二个名称中的 \1\3(跳过中间元音)。
您将括号本身 (i) 放在捕获组中。所以它也被捕获了。您必须仅将捕获组放在括号内的事物周围。
对你的正则表达式做一个小改动:
sub("(.*)\\(([a-z])\\)(.*)$", "\\1\\2\\3, \\1\\3", df)
【讨论】:
【参考方案3】:你可以使用
df <- c ("Do(i)lfal", "Do(i)lferl", "Steff(l)", "Steffe", "Steffi")
unlist(strsplit( paste(sub("(.*?)\\(([a-z])\\)(.*)", "\\1\\2\\3, \\1\\3", df), collapse=","), "\\s*,\\s*"))
# => [1] "Doilfal"
# [2] "Dolfal"
# [3] "Doilferl"
# [4] "Dolferl"
# [5] "Steffl"
# [6] "Steff"
# [7] "Steffe"
# [8] "Steffi"
请参阅 online R demo 和 first regex demo。 详情:
首先,sub
使用第一个匹配的正则表达式 (.*?)\(([a-z])\)(.*)
执行
(.*?)
- 尽可能少的任何零个或多个字符,被捕获到第 1 组 (\1
)
\(
- 一个 (
字符
([a-z])
- 第 2 组 (\2
):任何 ASCII 小写字母
\)
- 一个 )
字符
(.*)
- 尽可能多的零个或多个字符,被捕获到第 3 组 (\3
)
然后,结果是 paste
d 和 ,
字符作为折叠字符
然后,使用\s*,\s*
正则表达式拆分生成的字符向量,该正则表达式匹配用零个或多个空白字符括起来的逗号。
【讨论】:
以上是关于删除没有内容的字符串中的括号的主要内容,如果未能解决你的问题,请参考以下文章