2016-10-05 2 views
1

에서 GSUB와 운영자의 나는 다음과 같은 문자열이 있다고 가정 해 봅시다 :펄 정규 표현식을 사용하여 대문자로 변환하는 방법 | R

x = c("123 w. main ave., city, st", "mr. smith", "456 main st.") 

은 내가 대문자로 써야 알고있는 문자열의 특정 부분을 활용할 수 있어야합니다.

gsub("(m)(rs?\\.)|(a)(ve\\.[\\s,])|(s)(t\\.[\\s,$])", "\\U\\1\\L\\2", x, perl=T) 

그러나, 이것은 다음과 같은 결과 : 첫 번째 문자열에서

# [1] "123 w. main city, st" "Mr. smith"   "456 main" 

, 그것 때문에 일치하는 텍스트를 제거 나는 다음과 같은 방법으로 gsubperl를 사용하여이를 수 있다고 생각 해당 문자열에서 일치하는 정규식 그룹은 \\3\\4입니다. 두 번째 문자열에서는 그룹 \\1\\2과 일치하므로 의도 한대로 작동합니다. 세 번째 문자열에서 같은 이유로 첫 번째 문자열과 동일하게 처리했습니다.

# [1] "123 w. main Ave., city, st", "Mr. smith", "456 main St." 

내 질문을, 다음, 당신이있는 그룹과 대체 정규식을 어떻게 알 수 있습니까된다

내 원하는 결과는 다음과 같은 것입니까? 각 인스턴스마다 다른 정규식을 사용해야합니까?

+0

'$'는 문자열의 끝이라고 생각합니까? –

+0

@ WiktorStribiżew 그래,하지만 이제는 달러 기호가된다는 것을 깨닫고있다. 왜냐하면'[]'이 문자에 특별한 영향을 제거하기 때문이다 ... – brittenb

답변

2

은 내가 branch reset group ((?|...|...))를 사용하는 것이 좋습니다과 $ 문자열의 끝을 표시하기 위해 보이기 때문에, 당신은 교대 그룹 (?:[\s,]|$)보다는 [\s,$] 문자 클래스가 필요합니다.

x = c("123 w. main ave., city, st", "mr. smith", "456 main st.") 
gsub("(?|(m)(rs?\\.)|(a)(ve\\.[\\s,])|(s)(t\\.(?:[\\s,]|$)))", "\\U\\1\\L\\2", x, perl=T) 
## => [1] "123 w. main Ave., city, st" "Mr. smith" "456 main St." 

각각 별도의 지점에서 1, 그룹 내부의 모든 캡처 그룹이 시작 색인 분기 리셋 그룹에 this online R demo

감사를 참조하십시오.

+0

당신은 당신의 정규 표현식 기술에 깊은 인상을 남기지 않을 것이다. 감사! – brittenb

관련 문제