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