【问题标题】: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)

但它不是很有效

非常感谢

【问题讨论】:

    标签: r regex string


    【解决方案1】:
    df = gsub("[\\(\\)]", "",  df)
    

    【讨论】:

      【解决方案2】:

      你犯了两个小错误:

      1. 在第一种情况下,您需要 \1\2\3,因为您需要所有字母。它是您想要的第二个名称中的 \1\3(跳过中间元音)。

      2. 您将括号本身 (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 demofirst regex demo详情

        • 首先,sub 使用第一个匹配的正则表达式 (.*?)\(([a-z])\)(.*) 执行
          • (.*?) - 尽可能少的任何零个或多个字符,被捕获到第 1 组 (\1)
          • \( - 一个 ( 字符
          • ([a-z]) - 第 2 组 (\2):任何 ASCII 小写字母
          • \) - 一个 ) 字符
          • (.*) - 尽可能多的零个或多个字符,被捕获到第 3 组 (\3)
        • 然后,结果是 pasted 和 , 字符作为折叠字符
        • 然后,使用\s*,\s* 正则表达式拆分生成的字符向量,该正则表达式匹配用零个或多个空白字符括起来的逗号。

        【讨论】:

          猜你喜欢
          • 2017-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-12
          • 1970-01-01
          相关资源
          最近更新 更多