【问题标题】:Extract phone number regex提取电话号码正则表达式
【发布时间】:2014-01-27 06:13:24
【问题描述】:

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

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

这是一个已针对其他语言回答的问题(请参阅 phpabd general regex),但似乎没有在 SO for 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"

【问题讨论】:

    标签: regex r


    【解决方案1】:

    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】:

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

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

      【讨论】:

        【解决方案3】:

        这是我能做到的最好的了——你有很多格式,包括一些带有空格的格式,所以正则表达式非常通用。它只是说“查找至少由数字、句点、括号、连字符或空格组成的至少 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
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2017-09-23
        • 2014-02-15
        • 1970-01-01
        • 2016-02-02
        • 2011-12-14
        相关资源
        最近更新 更多