如何从文本文件中提取电话号码?
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)
这是我能做的最好的 - 你有各种各样的格式,包括一些带空格,所以正则表达式非常普遍.它只是说"查找至少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)
在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)