0

我想清理我的熊猫数据框中的电话号码列。我正在使用下面的代码,但它在最后留下了一个括号。如何获得正确的正则表达式以排除任何额外的字符,例如 (,或任何不属于电话号码的内容。我查看了旧帖子,但似乎找不到确切的解决方案。示例代码如下:

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.extract('([\(\)\s\d\-]+)',expand= True) 

expected 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

Current 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(

4

3 回答 3

5

您可以使用

((?:\(\d{3}\)|\d{3})?(?:\s|\s?-\s?)?\d{3}(?:\s|\s?-\s?)?\d{4})

查看正则表达式演示

细节

  • (?:\(\d{3}\)|\d{3})?- 一个可选的序列
    • \(\d{3}\)- (,三位数字,)
    • |- 或者
    • \d{3}- 三位数
  • (?:\s|\s?-\s?)?- 一个可选的空格字符序列或一个-包含单个可选空格的序列
  • \d{3}- 三位数
  • (?:\s|\s?-\s?)?- 一个可选的空格字符序列或一个-包含单个可选空格的序列
  • \d{4}- 四位数。

熊猫测试:

>>> df1['x'].str.extract(r'((?:\(\d{3}\)|\d{3})?(?:\s|\s?-\s?)?\d{3}(?:\s|\s?-\s?)?\d{4})',expand= True)
                 0
0       1234567890
1     202-456-3456
2   (202)-456-3456
3  (202)-456- 4567
4       1234564567
于 2020-04-08T08:11:50.470 回答
2

不同的方法怎么样?不要尝试匹配电话号码,而是删除您不想要的位:

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*$匹配字符串末尾的零个或多个非数字字符。

与 一起使用时replace,它匹配上述模式并将其替换为空字符串。

于 2020-04-08T08:22:28.563 回答
0

我会使用替换。

df1['x1'] = df1['x'].str.replace(r'(?<=\(\d{3}\)[-]\d{3}[-]\d{4})[a-z]*', '')
df1

Y如果它就在它的右边,只需简单地替换它X(?<+X)Y

Y= 小写字母数字组 -[a-z]*

X= () 之间的三位数字,后跟一个破折号\(\d{3}\)[-];另外三个数字和一个破折号\(\d{3}\)[-],最后是;四位数字和一个破折号 `(\d{4})

输出

在此处输入图像描述

于 2020-04-08T21:15:26.290 回答