在邮政编码之前使用添加状态进行地址格式设置



我有一个格式如下的地址:

street address, town zip

我需要在 zip 之前添加状态缩写,它总是 5 位数字。

我想我应该使用 regex 做下面这样的事情,但我不知道如何完成它:

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

我的问题是在???中放入什么以及我是否在outstr中正确使用了state变量。另外,我是否正确地获得了zip正则表达式?

您也可以使用 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 作为分隔符字符串。如果给出最大拆分,则在 大多数最大拆分都已完成,最右边的拆分。

  1. 您不能将变量"state"直接放入替换字符串中。您应该使用 python 字符串格式来引用变量。
  2. 保持正则表达式简单,假设数据很简单。如果 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  "

通用修复是使用条带和正则表达式,如我的代码所示。始终提前考虑输入数据质量,某些代码在经过单元测试后会失败。

最新更新