2014-11-16 3 views
1

У меня есть строка, как H B O & Co, и я хотел бы, чтобы удалить пробелы между H, B и O решений HBO & Co. В предыдущем вопросе я спросил (Remove spaces between words of a certain length), мне был дан очень полезный ответ, чтобы удалить пробелы в строках, например A & B Co, чтобы сделать A&B Co. Я хотел бы сохранить строки, такие как A&B Co, но избегайте таких строк, как HBO& Co. Для того, чтобы сделать это, я собирался просто запустить другое регулярное выражение над строками, чтобы исправить эти случаи:избежать «и» в регулярном выражении

gsub("(\\S\\S)\\&\\s", "$1 & ", "HBO& Co", perl=TRUE, ignore.case=TRUE) 

Это, однако, не кажется, что правильный ответ, потому что он не использует $1 как группа захвата 1. Любой идеи?

+1

Попробуйте '\ 1' вместо' $ 1'. – Asaph

+1

Кроме того, '&' не является метасимволом в любом аромате регулярных выражений, с которыми я когда-либо сталкивался, поэтому вам не нужно бежать. – Asaph

+0

yeh, добрый звонок на '\ 1' вместо' $ 1'. о чем это правило? – Alex

ответ

3

Ваш неверный адрес. Некоторые двигатели используют синтаксис \1, некоторые используют $1, некоторые позволяют оба. Чтобы вставить группы захвата в замены в R, перед номером группы вы должны пройти обратную косую черту. Также & не является символом особого значения, поэтому вы можете избежать экранирования, и я не вижу причин использовать ignore.case=TRUE в вашем вызове.

gsub('(\\S\\S)&\\s', '\\1 & ', 'HBO& Co', perl=TRUE) 
# [1] "HBO & Co" 

Однако, так как я answered предыдущий вопрос, который вы просили; Я говорю, что вы могли бы избежать запуска другого регулярного выражения, чтобы исправить эти пробелы и сделать это одним вызовом, добавив к регулярному выражению, которое я предоставил.

x <- c('A B C Company', 'XYZ Inc', 'S & K Co', 'H B O & Co', 'A & B Co') 
gsub('(?<!\\S\\S)\\s+(?!(&\\s+)?\\S\\S)', '', x, perl=TRUE) 
# [1] "ABC Company" "XYZ Inc"  "S&K Co"  "HBO & Co" "A&B Co" 
+0

вы можете объяснить, почему это '\\ 1' вместо' $ 1'? когда я пытаюсь использовать онлайн-проверку регулярных выражений, '$ 1' является правильным – Alex

+0

@Alex see edit ^^ – hwnd

1
gsub("(\\S\\S)\\&\\s", "\\1 & ", "HBO& Co", perl=TRUE, ignore.case=TRUE) 
Смежные вопросы