删除一定长度的单词之间的空格

时间:2014-10-23 22:05:53

标签: regex r string

我有以下种类的字符串:

A B C Company
XYZ Inc
S & K Co

我想在1个字母长度的单词之间删除这些字符串中仅 的空格。例如,在第一个字符串中,我想删除A BC之间的空格,但不删除C和公司之间的空格。结果应该是:

ABC Company
XYZ Inc
S&K Co

gsub中使用的正确的正则表达式是什么?

5 个答案:

答案 0 :(得分:19)

以下是一种方法,您可以看到&混合在一起而不是单词字符......

x <- c('A B C Company', 'XYZ Inc', 'S & K Co', 'A B C D E F G Company')
gsub('(?<!\\S\\S)\\s+(?=\\S(?!\\S))', '', x, perl=TRUE)
# [1] "ABC Company"     "XYZ Inc"         "S&K Co"          "ABCDEFG Company"

说明:

首先我们断言两个非空白字符不会背对背。然后我们查找并匹配空白“一次或多次”。接下来,我们先断言断言非空白字符在断言下一个字符不是非空格字符时。

(?<!        # look behind to see if there is not:
  \S        #   non-whitespace (all but \n, \r, \t, \f, and " ")
  \S        #   non-whitespace (all but \n, \r, \t, \f, and " ")
)           # end of look-behind
\s+         # whitespace (\n, \r, \t, \f, and " ") (1 or more times)
(?=         # look ahead to see if there is:
  \S        #   non-whitespace (all but \n, \r, \t, \f, and " ")
  (?!       #   look ahead to see if there is not:
    \S      #     non-whitespace (all but \n, \r, \t, \f, and " ")
  )         #   end of look-ahead
)           # end of look-ahead

答案 1 :(得分:10)

强制性strsplit / paste回答。这也将获得可能位于字符串中间或末尾的单个字符。

x <- c('A B C Company', 'XYZ Inc', 'S & K Co', 
       'A B C D E F G Company', 'Company A B C', 'Co A B C mpany')

foo <- function(x) {
    x[nchar(x) == 1L] <- paste(x[nchar(x) == 1L], collapse = "")
    paste(unique(x), collapse = " ")
}

vapply(strsplit(x, " "), foo, character(1L))
# [1] "ABC Company"     "XYZ Inc"         "S&K Co"         
# [4] "ABCDEFG Company" "Company ABC"     "Co ABC mpany"

答案 2 :(得分:7)

比赛迟到但这种模式适合你

(?<!\\S\\S)\\s+(?!\\S\\S)

Demo

答案 3 :(得分:1)

另一个选择

(?![ ]+\\S\\S)[ ]+

答案 4 :(得分:0)

您也可以通过PCRE动词(*SKIP)(*F)

执行此操作
> x <- c('A B C Company', 'XYZ Inc', 'S & K Co', 'A B C D E F G Company', ' H & K')
> gsub("\\s*\\S\\S+\\s*(*SKIP)(*F)|(?<=\\S)\\s+(?=\\S)", "", x, perl=TRUE)
[1] "ABC Company"     "XYZ Inc"         "S&K Co"          "ABCDEFG Company"
[5] " H&K"

<强>解释

  • \\s*\\S\\S+\\s*将匹配两个或多个非空格字符以及前后空格。
  • (*SKIP)(*F)导致匹配失败。
  • |现在可以从剩余的字符串中选择字符。
  • (?<=\\S)\\s+(?=\\S)匹配一个或多个以非空格开头,后跟非空格字符的空格。
  • 删除空格将为您提供所需的输出。

注意:看到最后一个元素,这个正则表达式不会在第一个元素中替换前面的空格,因为开头的空格前面没有一个非空格字符。