2016-03-04 69 views
-1

前添加狀態我有格式化的這樣一個地址:地址使用正則表達式的格式 - 郵政編碼

street address, town zip 

我需要的拉鍊,這始終是5個位數前加狀態的縮寫。

我想我應該用regex做一些像下面,但我不知道如何去完成它:

instr = "123 street st, anytown 12345" 
state = 'CA' 
outstr = re.sub(r'(???)(/\b\d{5}\b/g)', r'\1state\2', instr) 

我的問題是要放什麼東西在???是否我用state變量正確地在outstr。另外,我得到zip正則表達式是否正確?

回答

2

您還可以使用rsplit做到這一點:

instr = "123 street st, anytown 12345" 
state = 'CA' 
address, zip_code = instr.rsplit(' ', 1) # ['123 street st, anytown', '12345'] 
print '%s %s %s' % (address, state, zip_code) 
>> "123 street st, anytown CA 12345" 


str.rsplit文檔:

str.rsplit([SEP [,maxsplit]])
返回 字符串中單詞的列表,使用sep作爲分隔符iter字符串。如果給出maxsplit,則在 大多數maxsplit分裂完成,最右邊的分裂。

+1

這就是爲什麼我愛Python。我不得不添加更多的字符串處理,但它很好。謝謝! – pekasus

+0

我將添加另一個str.rstrip()以刪除尾隨空格,以防萬一數據包含尾隨空格,例如「123 street st,anytown 12345」,上面的代碼將失敗。 – mootmoot

1
  1. 您不能將變量「狀態」直接放入替換字符串中。你應該使用python字符串格式來引用變量。
  2. 保持regex簡單,假設數據很簡單。如果ZIP總是出現在字符串的末尾,那麼只需從最後匹配,使用$。

讓我試試:

instr = "123 street st, anytown 12345" 
# Always strip the trailing spaces to avoid surprises 
instr = instr.rstrip() 
state = 'CA' 
# Assume The ZIP has no trailing space and in last position.  
search_pattern = r"(\d{5})$" 
# 
# Format the replacement, since I search from the end, so group 1 should be fined 
replace_str = r"{mystate} \g<1>'.format(mystate = state)   
outstr = re.sub(search_pattern, replace_str, instr) 

@Forge例子是清晰而乾淨。但是,在使用str.rsplit()時,需要注意數據質量。例如

# If town and zip code stick together 
instr = "123 street st, anytown12345" 
# or trailing spaces 
instr = "123 street st, anytown 12345 " 

通用修復程序是使用我的代碼中顯示的strip和regex。總是要考慮輸入數據質量,經過單元測試後有些代碼會失敗。