Regex 在R中提取电话号码问题

Regex 在R中提取电话号码问题,regex,r,Regex,R,有这样的数字: ll <- readLines(textConnection("(412) 573-7777 opt 1 563.785.1655 x1797 (567) 523-1534 x7753 (567) 483-2119 x 477 (451) 897-MALL (342) 668-6255 ext 7 (317) 737-3377 Opt 4 (239) 572-8878 x 3 233.785.1655 x1776 (138) 761-6877 x 4 (411) 446-6

有这样的数字:

ll <- readLines(textConnection("(412) 573-7777 opt 1
563.785.1655 x1797
(567) 523-1534 x7753
(567) 483-2119 x 477
(451) 897-MALL
(342) 668-6255 ext 7
(317) 737-3377 Opt 4
(239) 572-8878 x 3
233.785.1655 x1776
(138) 761-6877 x 4
(411) 446-6626 x 14
(412) 337-3332x19
412.393.3177 x24
327.961.1757 ext.4"))
我试过这个:

gsub('[(]([0-9]{3})[)] ([0-9]{3})[-]([0-9]{4}).*','\\1-\\2-\\3',ll)

它并没有涵盖所有的可能性。我想我可以使用几个正则表达式模式来实现,但我认为可以使用单个正则表达式来实现。

如果您还想提取用字母表示的数字,可以在
gsub
中使用以下正则表达式:

gsub('[(]?([0-9]{3})[)]?[. -]([A-Z0-9]{3})[. -]([A-Z0-9]{4}).*','\\1-\\2-\\3',ll)

您可以从字符类中删除所有
A-Z
,只匹配没有字母的数字

正则表达式

  • [(]?
    -可选的
  • ([0-9]{3})
    -3位数字
  • [)]?
    -可选的
  • [.-]
    -点、空格或连字符
  • ([A-Z0-9]{3})
    -3位数字或字母顺序
  • [.-]
    -点、空格或连字符
  • ([A-Z0-9]{4})
    -4位数字或字母顺序
  • *
    -结尾任意数量的字符

购物中心的那家怎么样
MALL
不是一个数字。@Stribizev-
1800 PIZZA
等是电话号码,字母组与键盘上的数字相对应。@Stribizev很好。其目的是最大限度地提取与此模式相关的元素。同样相关的还有:
gsub('[(]?([0-9]{3})[)]?[. -]([A-Z0-9]{3})[. -]([A-Z0-9]{4}).*','\\1-\\2-\\3',ll)