2014-01-08 3 views
1

어떻게 텍스트 파일에서 전화 번호를 추출 할 수 있습니까? 전화 번호 정규식 추출

x <- c(" Mr. Bean bought 2 tickets 2-613-213-4567 or 5555555555 call either one", 
    "43 Butter Rd, Brossard QC K0A 3P0 – 613 213 4567", 
    "Please contact Mr. Bean (613)2134567", 
    "1.575.555.5555 is his #1 number", 
    "7164347566" 
) 

다른 언어에 대한 대답 됐어요 질문 ( php를 참조 ABD general regex)하지만 내가 검색 한 것으로 보이는 발견 R.

에 대한 SO에 달려있다하지 않는 것 전화 번호를 찾을 수있는 정규 표현식 (위의 다른 언어의 정규 표현식 이외에) : http://regexlib.com/Search.aspx?k=phone. 그러나 R에서 gsub을 사용하여 예제에서이 모든 숫자를 추출하지 못했습니다.

이상적으로, 우리는 같은 것을 얻을 것 :

[[1]] 
[1] "2-613-213-4567" "5555555555"  

[[2]] 
[1] "613 213 4567" 

[[3]] 
[1] "(613)2134567" 

[[4]] 
[1] "1.575.555.5555" 

[[5]] 
[1] "7164347566" 

답변

5

이것은 당신이 공간 일부를 포함하여 형식의 매우 넓은 범위가, 뭐하고 할 수있었습니다 최고입니다, 그래서 정규식입니다 꽤 일반. 그냥 "완전히 숫자, 마침표, 괄호, 하이픈 또는 공백으로 구성 적어도 5 문자열을 찾아"라는 :

library(stringr) 
str_extract_all(x, "(^|)[0-9.() -]{5,}(|$)") 

출력 :

[[1]] 
[1] " 2-613-213-4567 " " 5555555555 "  

[[2]] 
[1] " 613 213 4567" 

[[3]] 
[1] " (613)2134567" 

[[4]] 
[1] "1.575.555.5555 " 

[[5]] 
[1] "7164347566" 

리딩/후행 공백 수 아마도 약간의 추가 복잡성으로 수정 될 수도 있고 아니면 그냥 포스트에서 수정할 수도 있습니다.

업데이트 : 약간의 검색을 통해 this answer으로 약간의 기간을 허용하도록 수정되었습니다. 약간 유효한 (? 미국) 전화 번호를 요구하는 측면에서 엄격하지만,이 모든 예를 커버하는 것 같다

str_extract_all(x, "\\(?\\d{3}\\)?[.-]? *\\d{3}[.-]? *[.-]?\\d{4}") 

출력 : 당신이 꺼내 일단 괴물이 here을 발견

[[1]] 
[1] "613-213-4567" "5555555555" 

[[2]] 
[1] "613 213 4567" 

[[3]] 
[1] "(613)2134567" 

[[4]] 
[1] "575.555.5555" 

[[5]] 
[1] "7164347566" 

도 작동 양쪽 끝에 ^$ 당신 정말이 필요한 경우에만 사용

huge_regex = "(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?" 
+0

내가 조금 기다릴 수 있습니다. +1 –

1

당신은 전화 번호와 일치하는 모든 규칙을 포함하는 복잡한 정규식을해야하지만 예를 커버 할 수 있습니다.

> library(stringi) 
> unlist(stri_extract_all_regex(x, '(\\d[.-])?\\(?\\d{3}\\)?[-. ]?\\d{3}[-. ]?\\d{4}\\b')) 
# [1] "2-613-213-4567" "5555555555"  "613 213 4567" "(613)2134567" 
# [5] "1.575.555.5555" "7164347566" 
2

qdapRegex 이제 구체적으로이 작업을 위해 설계된 rm_phone있다 : 다른 사람이 응답 그러나 이것은 매우 잘 작동에 대한

library(qdapRegex) 
rm_phone(x, extract=TRUE) 

## [[1]] 
## [1] "613-213-4567" "5555555555" 
## 
## [[2]] 
## [1] "613 213 4567" 
## 
## [[3]] 
## [1] "(613)2134567" 
## 
## [[4]] 
## [1] "1.575.555.5555" 
## 
## [[5]] 
## [1] "7164347566"