繁体   English   中英

Python 电话号码的正则表达式表现异常

[英]Python Regex for Phone Numbers is acting strangely

我开发了一个 Python 正则表达式,大约 90% 的时间从文本中提取电话号码。 但是,有时会出现奇怪的异常情况。 我的代码如下:

phone_pattern = re.compile(r'(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})')
df['phone'] = df['text'].apply(lambda x: phone_pattern.findall(x))
df['phone']=df['phone'].apply(lambda y: '' if len(y)==0 else y)
df['phone'] = df['phone'].apply(', '.join)

此代码提取电话号码并附加一个名为“电话”的新列。 如果有多个数字,它们用逗号分隔。

但是,以下文本会生成一个奇怪的 output:

university of blah school of blah blah blah (jane doe doe) 1234567890 1234 miller Dr E233 MILLER DR blah blah fl zipcode in the morning or maybe Monday.

我当前的代码给我的 output 是:

890 1234

而不是所需的实际数量:

1234567890

这发生在几个例子上。 我试过编辑正则表达式,但这只会让情况变得更糟。 任何帮助,将不胜感激。 另外,我认为这个问题很有用,因为 Stackoverflow 上提供的很多电话正则表达式对我不起作用。

您可以使用

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

查看正则表达式演示

请注意,在第一个和第三个选项之前添加了\( \b单词边界,第二个以匹配 a (并且不需要单词边界检查的模式开头。最后也有一个单词边界。此外, [-.\s]第一个选项中的分隔符是可选的,一个?量词使它匹配 1 次或 0 次。

在 Pandas 中,只需使用

rx = r'(\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\(\d{3}\)\s*\d{3}[-.\s]\d{4}|\b\d{3}[-.\s]\d{4})\b'
df['phone'] = df['text'].str.findall(rx).apply(', '.join)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM