提取电话号码正则表达式

Tyl*_*ker 2 regex r

如何从文本文件中提取电话号码?

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"
)
Run Code Online (Sandbox Code Playgroud)

这是一个已被其他语言回答的问题(参见php abd general regex)但似乎没有在SO上为R解决.

我搜索并找到了可能的正则表达式来查找电话号码(除了上面其他语言的正则表达式):http://regexlib.com/Search.aspx?k = phone 但是无法在gsub内部使用R用这些来提取示例中的所有这些数字.

理想情况下,我们会得到类似的东西:

[[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"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ius 7

这是我能做的最好的 - 你有各种各样的格式,包括一些带空格,所以正则表达式非常普遍.它只是说"查找至少5个字符的字符串,完全由数字,句点,括号,连字符或空格组成":

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

输出:

[[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"
Run Code Online (Sandbox Code Playgroud)

前导/尾随空格可能会有一些额外的复杂性,或者你可以在post中修复它.

更新:一些搜索引导我得到这个答案,我稍作修改以允许句号.要求有效(美国?)电话号码有点严格,但似乎涵盖了所有示例:

str_extract_all(x, "\\(?\\d{3}\\)?[.-]? *\\d{3}[.-]? *[.-]?\\d{4}")
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

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

[[4]]
[1] "575.555.5555"

[[5]]
[1] "7164347566"
Run Code Online (Sandbox Code Playgroud)

这里发现的怪物一旦取出^并$在任何一端都有效.仅在您真正需要时使用:

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+))?"
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 6

在qdapRegex现在有rm_phone专门为这一任务设计的:

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"
)

library(qdapRegex)
ex_phone(x)

## [[1]]
## [1] "613-213-4567" "5555555555"  
## 
## [[2]]
## [1] "613 213 4567"
## 
## [[3]]
## [1] "(613)2134567"
## 
## [[4]]
## [1] "1.575.555.5555"
## 
## [[5]]
## [1] "7164347566"
Run Code Online (Sandbox Code Playgroud)