2016-05-24 9 views
5

Chcę użyć gsub do poprawienia niektórych nazw znajdujących się w moich danych. Chcę nazw takich jak "R. J." i "A. J." nie ma odstępu między literami.gsub tylko część wzoru

Na przykład:

x <- "A. J. Burnett" 

chcę użyć gsub dopasować wzór jego imię, a następnie usunąć przestrzeń:

gsub("[A-Z]\\.\\s[A-Z]\\.", "[A-Z]\\.[A-Z]\\.", x) 

Ale otrzymuję:

[1] "[A-Z].[A-Z]. Burnett" 

Oczywiście, zamiast [AZ], chcę rzeczywiste litery w oryginalnym imieniu. Jak mogę to zrobić?

+4

http://stackoverflow.com/questions/29463495/how-to-replace-many-special-charples-with-something-plus-special-charples – rawr

Odpowiedz

6

Użyj grup przechwytywania, załączając wzory w (...), i odwołaj się do przechwyconych wzorów za pomocą \\1, \\2 i tak dalej. W tym przykładzie:

x <- "A. J. Burnett" 
gsub("([A-Z])\\.\\s([A-Z])\\.", "\\1.\\2.", x) 
[1] "A.J. Burnett" 

Należy również pamiętać, że w wymianie nie trzeba uciec . znaków, gdyż nie ma tam szczególne znaczenie.

+0

Awesome, thank you! – Colin

1

Możesz użyć wyprzedzenia ((?=\\w\\.)) i wyprzedzić ((?<=\\b\\w\\.)), aby kierować takie przestrzenie i zastąpić je "".

x <- c("A. J. Burnett", "Dr. R. J. Regex") 
gsub("(?<=\\b\\w\\.) (?=\\w\\.)", "", x, perl = TRUE) 
# [1] "A.J. Burnett" "Dr. R.J. Regex" 

Spojrzenie wyprzedzeniem dopasowuje znak słowny (\\w), a następnie przez okres (\\.), a look-za-słowo pasuje granicę (\\b), a następnie znaku słownego i okres.