提取电话号码正则表达式

时间:2014-01-08 22:07:32

标签: 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"
)

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

我搜索并找到了可能的正则表达式来查找电话号码(除了上面其他语言的正则表达式):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"

3 个答案:

答案 0 :(得分:7)

这是我能做的最好的 - 你有各种各样的格式,包括一些带空格的格式,所以正则表达式非常普遍。它只是说“查找至少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}")

输出:

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

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

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

[[4]]
[1] "575.555.5555"

[[5]]
[1] "7164347566"

一旦你在两端取出^$,发现的怪物here也会有效。仅在确实需要它时才使用:

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

答案 1 :(得分: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"

答案 2 :(得分:2)

您需要一个复杂的正则表达式来涵盖匹配电话号码的所有规则,但要涵盖您的示例。

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