代码之家  ›  专栏  ›  技术社区  ›  Joe

使用gsub删除不总是在同一位置的特殊字符

r
  •  2
  • Joe  · 技术社区  · 5 月前

    我有一个字符串,我想删除其中的特殊字符和特殊字符周围的字母/数字。字符串的长度并不总是相同的。

    myString
    "a-a b-b cc-cc*"
    "1-1 *bb-bb"
    "aa-bb*"
    "aa-aa *3b-3b"
    

    我试图删除特殊字符和任何围绕它的字母/数字,这样它看起来就会像;

    myString
    "a-a b-b"
    "1-1"
    ""
    "aa-aa"
    
    5 回复  |  直到 5 月前
        1
  •  3
  •   jpsmith    5 月前

    基本的R答案很好——这是一种使用 stringr 一些简化的正则表达式将是:

    stringr::str_trim(stringr::str_remove_all(xx, "\\b\\w+-\\w+\\*|\\*\\w+-\\w+\\b"))
    
    # [1] "a-a b-b" "1-1"     ""        "aa-aa"  
    
        2
  •  3
  •   Tim G    5 月前

    做这个

    myString <- c("a-a b-b cc-cc*","1-1 *bb-bb","aa-bb*","aa-aa *3b-3b")
    trimws(gsub("\\s*\\w+-\\w+\\*|\\*\\w+-\\w+|\\w+\\*\\w+", "", myString))
    

    结果

    "a-a b-b" "1-1"     ""        "aa-aa"
    

    解释 gsub

    • \\w+-\\w+\\* :带有“-”后跟“*”的单词字符 或
    • \\*\\w+-\\w+ :*后跟带“-”或的单词字符
    • \\w+\\*\\w+ :单词字符,然后是“*”,然后是单词字符

    trimws() 删除剩余的空格

        3
  •  3
  •   Onyambu    5 月前

    另一个正则表达式是:

    gsub(" ?[^ ]*[*][^ ]*", "", myString) # remove any word that contains *
    [1] "a-a b-b" "1-1"     ""        "aa-aa" 
    
        4
  •  2
  •   Andre Wildberg    5 月前

    如果我们能搜索一个 * 跟在任何字符后面的

    sapply(strsplit(myString, " "), \(x) 
      paste(x[!grepl("\\*.+|.+\\*", x)], collapse=" "))
    [1] "a-a b-b" "1-1"     ""        "aa-aa"
    

    这可能会降低正则表达式的复杂性。

        5
  •  2
  •   Greg Snow    5 月前

    已经有一些很好的答案了,但这里有一个更简单的答案。这个 \\s \\w 模式依赖于Perl正则表达式,下面我不使用它们,但如果你正在使用 perl=TRUE 然后他们可以简化事情。

    由于正则表达式在默认情况下是贪婪的,或者是最左边最长的,所以我们不需要使用“or” | ,字符类和可能的零长度匹配将起作用。

    因此,一个基本模式是:

    myString <- c("a-a b-b cc-cc*","1-1 *bb-bb","aa-bb*","aa-aa *3b-3b")
    
    gsub("[-a-z0-9]*\\*[-a-z0-9]*", "", myString)
    

    这会留下空格,要删除空格,请使用:

    gsub("[[:blank:]]*[-a-z0-9]*\\*[-a-z0-9]*[[:blank:]]*", "", myString)