[英]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.