2016-07-21 4 views
2

연속되는 한 단어로 된 문자를 모두 검색하고 그 사이의 공백을 삭제하고 싶습니다. 그러나 문장 부호는 존중되어야합니다. 예를 들어, 내가있는 경우 :R의 텍스트 컨텍스트 바꾸기

sampleText = "Abc defg h i j k, l mn, o p qrst." 

나는 이렇게 될 내 결과를 싶습니다

processedText = "Abc defg hijk, l mn, op qrst." 

는 R에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

내가 절대적으로 지금을 계획했다면

, 나는 아마 것 :

  1. str_extract(sampleText, pattern = \\w(?: \\w)+)

  2. str_replace(extractedText, " ", "")

  3. 삽입 대체 텍스트를 (각 검출 문자 위치를 기억) 1 단계의 인덱스를 사용하여 끝에서 시작하여 뒤로 이동합니다.

그러나 이것은 매우 비효율적 인 것처럼 들립니다. 나는이 모든 소란이 없이는 이것을 할 수있는 방법이 있다고 추측하고있다. 맞습니까?

+0

공백 만 제거하려는 경우 어떻게 쉼표가 제거됩니까? '(str_replace (sampleText, "

+0

깔끔한 쉼표는 존중되어야합니다. 제안 된 패턴은 ""Abc defg hi j k, l mn, o p qrst "를 생성합니다." – GerasimosPanagiotakopoulos

+0

ICU와 PCRE 엔진의 차이점이 있습니다. 'gsub ("(?

답변

1

는 I베이스 R에서 gsub와 PCRE 기반 정규식을 사용하여 제안 :

gsub("(?<!\\S)(\\w)\\s(?=\\w\\b)", "\\1", sampleText, perl=TRUE) 
[1] "Abc defg hijk, l mn, op qrst." 

regex demo is here.

세부 :

  • (?<!\\S) - 만 일치 ASCII에 [a-zA-Z]로 교체, 그룹 1 캡처 한 단어 문자 ([a-zA-Z0-9_] - ...
  • (\\w) 전에 공백이 아닌 문자가 안 문자를 사용하거나 필요에 따라 조정)
  • \\s - 공백
  • (?=\\w\\b) - 단어 char f가 있어야합니다 단어 경계에 의해 ollowed.

대체 패턴의 \1은 캡처 된 값을 그룹 1 에 삽입하여 결과 문자열로 되돌립니다.

+0

매력처럼 작동했습니다! 고마워요! 표현식이'*'또는'+ '한정 기호를 사용하지 않고 여러 조합을 포착하는 방법을 잘 모르겠습니다.캡처 된 그룹을 대체하기 때문에 프로세스가 재귀 적으로 계속됩니다. – GerasimosPanagiotakopoulos

+1

'gsub'는 입력 문자열에서 중복되지 않는 여러 텍스트 청크와 일치하며이를 대체 패턴으로 바꿉니다. '(?

+0

내가 이것을 할 수있는 것은 처음이다! :) – GerasimosPanagiotakopoulos