Подтвердить что ты не робот

Удалите пробелы между словами определенной длины

У меня есть строки следующего сорта:

A B C Company
XYZ Inc
S & K Co

Я хотел бы удалить пробелы в этих строках, которые находятся только между словами длиной в 1 букву. Например, в первой строке я хотел бы удалить пробелы между A B и C, но не между C и Company. Результат должен быть:

ABC Company
XYZ Inc
S&K Co

Какое правильное выражение регулярного выражения используется в gsub для этого?

4b9b3361

Ответ 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) сопоставляется одно или несколько пробелов, которым предшествует непространство, за которым следует непространственный символ.
  • Удаление пробелов даст вам желаемый результат.

Примечание: См. последний элемент, это регулярное выражение не заменит предыдущие пробелы в первом, потому что пробелам в начале не предшествует один непространственный символ.