Как насчет другого подхода? Вместо того, чтобы пытаться сопоставить номера телефонов, удалите ненужные биты:
import pandas as pd
df1 = pd.DataFrame({'x': ['1234567890', '202-456-3456', '(202)-456-3456adsd', '(202)-456- 4567', '1234564567(dads)']})
df1['x1'] = df1['x'].str.replace(r'\([^0-9]+\)|\D*$', '')
Output:
x x1
0 1234567890 1234567890
1 202-456-3456 202-456-3456
2 (202)-456-3456adsd (202)-456-3456
3 (202)-456- 4567 (202)-456- 4567
4 1234564567(dads) 1234564567
Это означает использование str.replace
вместо str.extract
, но я думаю, что в результате код будет проще.
Объяснение: \([^0-9]+\)
соответствует любым символам, кроме 0-9 в скобках.
|
означает логическое ИЛИ.
\D*$
соответствует нулю или более без нумерации c символов в конце строки.
Используется с replace
, соответствует приведенному выше шаблону и заменяет его пустой строкой.