簡體   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