删除没有内容的字符串中的括号

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) 然后,结果是 pasted 和 , 字符作为折叠字符 然后,使用\s*,\s* 正则表达式拆分生成的字符向量,该正则表达式匹配用零个或多个空白字符括起来的逗号。

【讨论】:

以上是关于删除没有内容的字符串中的括号的主要内容,如果未能解决你的问题,请参考以下文章

仅当内容具有某些单词时,正则表达式才删除括号和内部内容

从字符串中删除不匹配的括号

c#用正则表达式提取小括号中的内容

从R中的列名末尾删除不定长度括号中的字符

Python正则表达式删除所有方括号及其内容

SQLServer去掉括号及括号里的内容