다음과 같은 x가 있다고 하자.
우리는 여기에서 이메일 주소만 예쁘게 뽑아서
다음과 같이 만들 것이다.
그러기 위해서는 두 가지 함수를 써야 하는데
첫 번째는 '일치하는 문자열만 뽑아줘' regmatches() 이고,
두 번째는 그 일치하는 문자열의 형식을 지정하는 regexpr() 이다.
조합하면 regmatches(regexpr()) 와 같이 될 테니, regexpr()부터 먼저 보자.
사실 regexpr()은 R뿐 아니라 여기저기서 쓰는 유명한 녀석인 '정규표현식' 이라는 녀석을 다루는 함수다.
정규표현식을 다 다루기에는 분량이 너무 방대하고, 일단 팁 하나.
http://regexr.com/
위 사이트에 가면 정규표현식을 공부하고 직접 실습해볼 수 있다.
이제 이메일 주소에 대한 정규표현식을 만들어 보자.
이메일 주소 형식을 대략적으로 표현하면 다음과 같다.
***@***.***
일단 @과 . 부터 표현해보자. []로 둘러싸 주면 된다.
***[@]***[.]***
이제 @ 앞 부분을 표현해 보자.
(공백이나 "/" 등은 포함하지 않는) '모든 알파벳과 숫자'라고 하면 되겠다.
'모든 알파벳과 숫자'는 [a-zA-Z0-9]로 표현한다.
[a-zA-Z0-9][@]***[.]***
.com 이나 .net 등 맨 끝 부분도 마찬가지로 공백과 특수문자를 포함하지 않는 문자일 것이므로
[a-zA-Z0-9][@]***[.][a-zA-Z0-9]
그런데 [a-zA-Z0-9]는 모든 알파벳과 숫자 '1개'를 의미한다.
맨 앞과 맨 끝에는 일련의 문자열이 온다. 그러니 '여러개'라고 지정해 주어야 할 것이다.
+ 기호를 붙이면 '앞에 있는 문자 여러개' 를 표현하게 된다.
따라서
[a-zA-Z0-9]+[@]***[.][a-zA-Z0-9]+
@와 . 사이에 있는 부분도 [a-zA-Z0-9]+를 이용하면 되나,
@와 . 이 명확한 경계가 되어 주므로 그냥 '아무거나' 라고 선언해 주자.
. 이 '아무거나' 에 해당하는 문자이며, 역시 여러개가 올 수 있으므로 +를 사용하여
[a-zA-Z0-9]+[@].+[.][a-zA-Z0-9]+
와 같이 간단히 적어주면 된다.
끝!
이지만... 생각해 보면 주소끝에는 .com이나 .net 외에 .co.uk나 .or.kr 등도 올 수 있으므로
① ***[@]***[.]***
와
② ***[@]***[.]**[.]**
을 모두 생각해 주어야 한다.
즉 ***[@]***[.]까지는 동일하고 그 뒤가 ① 또는 ②의 경우를 모두 포함해야 한다.
이를 위해 'or'의 역할을 하는 연산자 | 를 이용하여 다음과 같이 입력해 주자.
***[@]***[.][***|**[.]**]
*을 적절한 명령으로 바꾸면 다음과 같다.
[a-zA-Z0-9]+[@].+[.][[a-zA-Z0-9]+|[a-zA-Z0-9]+[.][a-zA-Z0-9]+]
마지막으로 하나만 더 추가하자.
이메일 주소의 @ 앞부분에는 간혹 대시(-)나 언더바(_) 등을 사용하는 유저도 있으므로
다음과 같이 -_.+ 등을 포함시켜야 해당 특수문자가 포함된 메일주소도 정상적으로 추출된다.
[-_.+a-zA-Z0-9]+[@].+[.][[a-zA-Z0-9]+|[a-zA-Z0-9]+[.][a-zA-Z0-9]+]
이렇게 이메일 주소에 대한 정규표현식이 완성되었다.
자, 이제 regexpr()안에 넣어 주자. regexpr()은 regexpr("(정규표현식)", 적용할 벡터) 와 같이 사용하면 된다.
잠깐, 벡터라고?
우리의 x는 벡터가 아닌 데이터프레임이므로, 바꾸어주자.
x의 emails 열만 떼어 와서 한 줄의 벡터를 만들었다.
이제 적용! regmatches()는 regmatches(적용할 벡터, regexpr()) 처럼 적어주면 된다.
조금 복잡해 보이지만, 위의 그 정규표현식 때문에 그렇다.
간단히 하면 아래와 같다.
regmatches(y, regexpr("(이메일 정규표현식)", y))
쨘! 깔끔한 이메일 벡터 z를 얻었다.
데이터프레임으로 보고 싶다면 다시 변환해 주면 된다.
'R' 카테고리의 다른 글
[R. 아르] 리스트에 없는 항목만 추출하기 (차집합, setdiff()) (0) | 2016.09.23 |
---|---|
[R. 아르] 내용 합치기 paste() (0) | 2016.09.22 |
[R.아르] 중복된 행 삭제하기 unique() / duplicated() (0) | 2016.09.12 |
[R.아르] 중복된 값의 개수 세기(엑셀의 countif) (1) | 2016.09.09 |
[R.아르] R에서 엑셀의 vlookup() 기능 사용하기 (0) | 2016.09.08 |
[R.아르] 특정 조건을 만족하는 행의 개수 구하기 (2) | 2016.09.05 |
[R.아르] 특정 조건을 만족하는 행만 추출하기 (22) | 2016.09.05 |
[R.아르] 글자 수 세기 nchar() (0) | 2016.09.02 |
[R.아르] R 행,열 삭제 (0) | 2016.08.30 |
[R.아르] R 행,열 추가 (1) | 2016.08.30 |
댓글