我有以下种类的字符串:
A B C Company
XYZ Inc
S & K Co
我想在1个字母长度的单词之间删除这些字符串中仅 的空格。例如,在第一个字符串中,我想删除A
B
和C
之间的空格,但不删除C
和公司之间的空格。结果应该是:
ABC Company
XYZ Inc
S&K Co
在gsub
中使用的正确的正则表达式是什么?
答案 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)
答案 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)
匹配一个或多个以非空格开头,后跟非空格字符的空格。注意:看到最后一个元素,这个正则表达式不会在第一个元素中替换前面的空格,因为开头的空格前面没有一个非空格字符。