Regex 删除单词中除单撇号和连字符以外的所有标点符号

Regex 删除单词中除单撇号和连字符以外的所有标点符号,regex,r,gsub,Regex,R,Gsub,我以前也问过类似的问题,但这个问题更具体,需要的解决方案与之前提供的不同,所以我希望可以发布它。我只需要在文本中保留撇号和单词内的破折号(删除所有其他标点符号)。例如,我想从str1获取str2: str1<-"I'm dash before word -word, dash &%$,. in-between word, two before word --word just dashes ------, between words word - word" str2<-"I

我以前也问过类似的问题,但这个问题更具体,需要的解决方案与之前提供的不同,所以我希望可以发布它。我只需要在文本中保留撇号和单词内的破折号(删除所有其他标点符号)。例如,我想从str1获取str2:

str1<-"I'm dash before word -word, dash &%$,. in-between word, two before word --word just dashes ------, between words word - word"
str2<-"I'm dash before word word dash in-between word two before word  word just dashes  between words word  word"
str1我认为这就做到了:

gsub('( |^)-+|-+( |$)', '\\1', gsub("[^ [:alnum:]'-]", '', str1))
#[1] "I'm dash before word word dash  in-between word two before word word just dashes  between words word  word"
以下是一种方法:

gsub("([[:alnum:]][[:punct:]][[:alnum:]])|[[:punct:]]", "\\1", str1)
# [1] "I'm dash before word word dash  in-between word two before word word just dashes  between words word  word"
或者更明确地说:

gsub("([[:alnum:]]['-][[:alnum:]])|[[:punct:]]", "\\1", str1)
同样的东西,略有不同/更短:

gsub("(\\w['-]\\w)|[[:punct:]]", "\\1", str1, perl=TRUE)
我建议

x <- "I'm dash before word -word, dash &%$,. in-between word, two before word --word just dashes ------, between words word - word"
gsub("\\b([-'])\\b|[[:punct:]]+", "\\1", x, perl=TRUE)
# =>  "I'm dash before word word dash  in-between word two before word word just dashes  between words word  word"
看。详情:


  • \b([-'])\b
    -
    -
    '
    随附字符(字母、数字或
    )(注意:如果您只想保留字母之间的间隔,请使用
    (?亲爱的,谢谢。我理解“-+-+”的意思是:如果破折号出现在单词之前或之后1次或多次,请将其替换为破折号,但我认为是“|”用于交替匹配(例如/(e | d)n/匹配“en”和“dn”)。我想知道在您的解决方案中是否以类似的方式使用它,以及开头和结尾的空格是否有含义…
    “-++-+”
    表示“一个空格后跟一个或多个破折号,或者一个或多个破折号后跟一个空格”经过一些测试,我注意到我的文本中仍然有一些不需要的破折号,我想我的问题不够精确。你能帮忙吗?建议的行不会删除单词前或单词之间的多个破折号,如以下字符串:string3@user3722736我修改了以处理开始/结束破折号。您可以添加另一个
    gsub
    要消除单词之间剩余的多个破折号:
    gsub(“-+”,“-”,位于结果上方)
    最后一个选项非常棒,应该选择它作为正确答案
    \b([-'])\b|[[:punct:]]+
    
    res <- gsub("\\b([-'])\\b|[[:punct:]]+", "\\1", x, perl=TRUE)
    res <- trimws(gsub("\\s{2,}", " ", res))