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.1112
和222.212.2333
。
我尝试通过添加.
来修改reg
但这并没有给我我正在寻找的东西
reg = r'(?s.*d?s*-?d{3}s*[)-]?-?s*d{3}s*-?s*d{4})?'
我想要的输出如下,其中包括1.210.223.1112
和222.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']