2017-03-01 28 views

Odpowiedz

5

Można użyć wyrażenia regularnego PCRE z ujemnym lookbehind i uprzedzona:

j <- "Abc,Abc, and c" 
gsub("(?<!\\s),(?!\\s)", " ", j, perl = TRUE) 
## => [1] "Abc Abc, and c" 

Zobacz regex demo

Szczegóły:

  • (?<!\\s) - nie może być spacji tuż przed ,
  • , - dosłownym ,
  • (?!\\s) - nie może być spacji zaraz po ,

Alternatywnym rozwiązaniem jest, aby dopasować , że jest otoczony granicami słów:

j <- "Abc,Abc, and c" 
gsub("\\b,\\b", " ", j) 
## => [1] "Abc Abc, and c" 

Zobacz another R demo.

+0

Jest to funkcjonalny odpowiednik: ' "(= \\ S?) (<= S \\?)"'? – nrussell

+1

Nie, negatywne spojrzenia nie są równoważne pozytywnym, ponieważ pozytywne obejścia wymagają obecności wzorca. Zwykle różnica jest widoczna na początku/końcu pozycji ciągów. '(? <= \ S)' wymaga innego niż spacja przed następnym podpisem, dlatego nie będzie dopasowania na początku łańcucha. '(?

+0

Wow, dzięki za szybką odpowiedź i doskonałą odpowiedź! – tsutsume

3

Można użyć powrotem odniesień tak:

gsub("([^ ]),([^ ])","\\1 \\2" ,j) 
[1] "Abc Abc, and c" 

() w wyrażeniu regularnym uchwycenie znaków sąsiadujących z przecinkiem. Modele \\1 i \\2 zwracają te przechwycone wartości w kolejności ich przechwytywania.

3

Możemy spróbować

gsub(",(?=[^ ])", " ", j, perl = TRUE) 
#[1] "Abc Abc, and c" 
0

Może to działa również:

library("stringr") 
j<-"Abc,Abc, and c" 
str_replace(j,"(\\w+),([\\w]+)","\\1 \\2")