Удалите пробелы между словами определенной длины
У меня есть строки следующего сорта:
A B C Company
XYZ Inc
S & K Co
Я хотел бы удалить пробелы в этих строках, которые находятся только между словами длиной в 1 букву. Например, в первой строке я хотел бы удалить пробелы между A
B
и C
, но не между C
и Company. Результат должен быть:
ABC Company
XYZ Inc
S&K Co
Какое правильное выражение регулярного выражения используется в gsub
для этого?
Ответы
Ответ 1
Вот один из способов сделать это, видя, как &
смешивается, а не символ слова...
x <- c('A B C Company', 'XYZ Inc', & 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
Ответ 2
Обязательный strsplit
/paste
ответ. Это также получит те одиночные символы, которые могут находиться в середине или в конце строки.
x <- c('A B C Company', 'XYZ Inc', & 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"
Ответ 3
Поздняя игра, но этот шаблон будет работать для вас.
(?<!\\S\\S)\\s+(?!\\S\\S)
Демо
Ответ 4
Другой вариант
(?![ ]+\\S\\S)[ ]+
Ответ 5
Вы можете сделать это также с помощью глагола PCRE (*SKIP)(*F)
> x <- c('A B C Company', 'XYZ Inc', & 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)
сопоставляется одно или несколько пробелов, которым предшествует непространство, за которым следует непространственный символ.
- Удаление пробелов даст вам желаемый результат.
Примечание: См. последний элемент, это регулярное выражение не заменит предыдущие пробелы в первом, потому что пробелам в начале не предшествует один непространственный символ.