除单引号和连字符外,删除所有标点符号,包括单词内部的标点符号

3

我之前问过类似的问题,但这个问题更加具体,需要不同的解决方案,所以希望可以发表。我需要在文本中只保留撇号和连字符(删除所有其他标点符号)。例如,我想从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"

目前的解决方案首先移除单词之间的破折号:
gsub(" - ", " ", str1)

然后保留字母、数字和剩余破折号:
gsub("[^[:alnum:]['-]", " ", str1)

问题是,它不能移除连续的破折号,例如“—”以及单词开头和结尾的破折号:“-word”或“word—”

3个回答

7
我认为这样就可以了:
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"

谢谢,我明白这个 ' -+|-+ ' 的意思:如果在单词前或后出现一个或多个破折号,则替换为破折号,但我认为 "|" 用于交替匹配(例如 /(e|d)n/ 匹配 "en" 和 "dn")。我想知道它是否在你的解决方案中以类似的方式使用,并且开头和结尾的空格是否有意义... - user3722736
1
'-+|-+' 表示 "一个空格后跟随1个或多个破折号,或者1个或多个破折号后跟随一个空格"。 - eddi
经过一些测试,我注意到我的文本中仍然有一些不必要的破折号,我想我的问题没有表达得够清楚。你能帮忙吗?建议的代码行不能去除单词之前或之间的多个破折号,例如在这个字符串中:"---before word, two or more between word--word, at the end--" 我只想保留单个单词内的破折号。 - user3722736
@user3722736 我进行了修改以处理起始/结束破折号。您可以添加另一个 gsub 来消除单词之间剩余的多个破折号:gsub('-+', '-', above_result) - eddi

4

以下是一种方法:

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)

1
最后一个选项很棒,应该选择为正确答案。 - David Arenburg

0

我建议

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"

请查看R演示。正则表达式为

\b([-'])\b|[[:punct:]]+

请查看正则表达式演示。详情如下:

  • \b([-'])\b - 匹配被单词字符(字母、数字或_)包围的-'(注意:如果您只想保留字母之间的内容,请改用(?<=\p{L})([-'])(?=\p{L})
  • | - 或
  • [[:punct:]]+ - 一个或多个标点符号。

为了删除此替换后产生的任何前导/尾随和双重空格字符,您可以使用

res <- gsub("\\b([-'])\\b|[[:punct:]]+", "\\1", x, perl=TRUE)
res <- trimws(gsub("\\s{2,}", " ", res))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接