删除字符串中所有包含标点(R)的单词

时间:2019-06-06 05:14:50

标签: r regex string gsub

如何(在R中)删除包含标点符号的字符串中的任何单词,而使单词不包含标点?

  test.string <- "I am:% a test+ to& see if-* your# fun/ction works o\r not"

  desired <- "I a see works not"

3 个答案:

答案 0 :(得分:4)

以下是使用sub的方法,该方法似乎可行:

test.string <- "I am:% a test$ to& see if* your# fun/ction works o\r not"
gsub("[A-Za-z]*[^A-Za-z ]\\S*\\s*", "", test.string)

[1] "I a see works not"

这种方法是使用以下正则表达式模式:

[A-Za-z]*     match a leading letter zero or more times
[^A-Za-z ]    then match a symbol once (not a space character or a letter)
\\S*          followed by any other non whitespace character
\\s*          followed by any amount of whitespace

然后,我们只替换为空字符串,以删除其中包含一个或多个符号的单词。

答案 1 :(得分:2)

您可以使用此正则表达式

(?<=\\s|^)[a-z0-9]+(?=\\s|$)
  • (?<=\\s|^)-后面是正号,匹配项之前应加空格或字符串开头。
  • [a-z0-9]+-一次或多次匹配字母和数字,
  • (?=\\s|$)-匹配项后必须跟空格或字符串结尾

Demo

蒂姆的编辑:

此答案使用白名单方法,即确定OP 确实想要保留在其输出中的所有单词。我们可以尝试使用上面给出的正则表达式模式进行匹配,然后使用paste连接匹配向量:

test.string <- "I am:% a test$ to& see if* your# fun/ction works o\\r not"
result <- regmatches(test.string,gregexpr("(?<=\\s|^)[A-Za-z0-9]+(?=\\s|$)",test.string, perl=TRUE))[[1]]
paste(result, collapse=" ")

[1] "I a see works not"

答案 2 :(得分:0)

还有其他几种方法

第一种方法:

42..toString()   // '0'

第二种方法:

1 + '2'    // '12', which should be '02'
  • str_split(test.string, " ", n=Inf) %>% # spliting the line into words unlist %>% .[!str_detect(., "\\W|\r")] %>% # detect words without punctuation or \r paste(.,collapse=" ") # collapse the words to get the line -仅具有[a-zA-Z0-9_]并且也是字符串开头的单词
  • str_extract_all(test.string, "^\\w+|\\s\\w+\\s|\\w+$") %>% unlist %>% trimws() %>% paste(., collapse=" ") -具有[a-zA-Z0-9_]且在单词前后有空格的单词
  • ^\\w+-具有[a-zA-Z0-9_]并且也是字符串结尾的单词