我有一個地址資料集作為字串,我想將它們分成它們的部分。到目前為止,我使用的是split()處理單個組件的方法和一些邏輯。這適用于非常簡單的示例,但當我想處理其他情況時,它會付出巨大的努力。例如,當州和郵政編碼之間缺少空格時。
我也考慮過用逗號作為分隔符,但是當沒有逗號時這顯然不起作用。
"1015 Jefferson St, Santa Clara, CA 95050, USA"
"1015 Jefferson St, Santa Clara, CA 95050"
"1015 Jefferson St Santa Clara CA 95050"
"Santa Clara, CA95050"
有沒有一種有效的方法來解決決議這些地址的任務?上面的例子顯示了幾乎所有不同的情況。另外,我現在可以不將街道和城市分開,并且所有地址都在美國,所以USA可以忽略這一點。
uj5u.com熱心網友回復:
我認為,您正在尋找的是正則運算式。這是匹配字串中模式的強大工具。它適用于許多編程語言。
以下代碼應該適用于您的目的。為了測驗和修改正則運算式,這個站點提供了一個很好的測驗平臺。
import re
source_string = "1015 Jefferson St, Santa Clara, CA 95050, USA"
result = re.search(r"(.*?),?\s?([A-Z]{2})\s?([0-9]{5})", source_string)
street_city = result.group(1)
state = result.group(2)
zip_code = result.group(3)
結果:
street_city = 1015 Jefferson St, Santa Clara
state = CA
zip_code = 95050
解釋:
[A-Z]{2}完全匹配兩個大寫字母(狀態)。[0-9]{5}完全匹配五個數字(郵政編碼)。- 在這些之間,可能有也可能沒有空格(
\s?),但沒有別的。 - 在狀態之前,可能有也可能沒有逗號 (
,?) 和空格 (\s?),但我們不希望它們成為街道和城市結果字串的一部分。 - 在此之前的一切都將被視為街道和城市的字串。但是我們不希望它包含尾隨空格和逗號,所以我們通過使用
?after來告訴它匹配“lazy”*:.*? - 通過使用普通的小括號進行分組,我們得到了組,我們稍后可以將這些組僅得到總匹配字串的一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497420.html
下一篇:如何使用硒查找“文本”?
