使用正则表达式获取带有句点的电话号码


import re
s = ' 1.210.223.1112 (113)-945-6373; 222.212.2333 (111)123-4567 (111)1234567 (111 )123-4567 n(1-100-533-1710)the  ( 111)123-4567 Z1902022 (111)123-4567 N18-2181 Z1234567 1-22-2001 (100) 115-5198 f: (110)-111-1111 112.222.1112 (222)-222-3337 (120) 305-1314' 

我有一个电话号码列表,我想获取字符串s中存在的所有变体。从修改使用正则表达式选择电话号码的变体,我尝试了以下方法

reg = r'(?s*d?s*-?d{3}s*[)-]?-?s*d{3}s*-?s*d{4})?'
r1 = re.findall(reg,s)
r1

这让我接近我想要的东西

['(113)-945-6373',
'(111)123-4567',
'(111)1234567',
'(111 )123-4567',
'(1-100-533-1710)',
'( 111)123-4567',
'(111)123-4567',
'(100) 115-5198',
'(110)-111-1111',
'(222)-222-3337',
'(120) 305-1314']

但是,它缺少1.210.223.1112222.212.2333

我尝试通过添加.来修改reg但这并没有给我我正在寻找的东西

reg = r'(?s.*d?s*-?d{3}s*[)-]?-?s*d{3}s*-?s*d{4})?'

我想要的输出如下,其中包括1.210.223.1112222.212.2333

['1.210.223.1112',
'(113)-945-6373',
'222.212.2333',
'(111)123-4567',
'(111)1234567',
'(111 )123-4567',
'(1-100-533-1710)',
'( 111)123-4567',
'(111)123-4567',
'(100) 115-5198',
'(110)-111-1111',
'(222)-222-3337',
'(120) 305-1314']

如何更改reg以获得所需的输出?

您很接近,只需在查找-时添加一个可选的点匹配.?,并在数字前面有( whitespace和空格时分开大小写:

(?:(?:(s)|(?d?)-?.?d{3}s*[)-]?-?.?s*d{3}s*-?.?s*d{4})?

正则表达式演示

等效,但使用 OR|和不匹配组:

(?:(?:(s)|(?d?)(?:-|.)?d{3}s*[)-]?(?:-|.)?s*d{3}s*(?:-|.)?s*d{4})?

正则表达式演示

输出:

['1.210.223.1112',
'(113)-945-6373',
'222.212.2333',
'(111)123-4567',
'(111)1234567',
'(111 )123-4567',
'1-100-533-1710',
'( 111)123-4567',
'(111)123-4567',
'(100) 115-5198',
'(110)-111-1111',
'112.222.1112',
'(222)-222-3337',
'(120) 305-1314']
re.findall(r'(?:bd[.-])?(?s?d{3}[.) -]{0,2}d{3}[ .-]?d{4}',s)
Out[31]: 
['1.210.223.1112',
'(113)-945-6373',
' 222.212.2333',
'(111)123-4567',
'(111)1234567',
'(111 )123-4567',
'1-100-533-1710',
'( 111)123-4567',
'(111)123-4567',
'(100) 115-5198',
'(110)-111-1111',
' 112.222.1112',
'(222)-222-3337',
'(120) 305-1314']

最新更新