使用正则表达式的地址格式 - 在邮政编码之前添加状态

Address formatting using regex - add state before zip code

我的地址格式如下:

street address, town zip

我需要在邮编前加上国家缩写,它总是5位数字。

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

instr = "123 street st, anytown 12345"
state = 'CA'
outstr = re.sub(r'(???)(/\b\d{5}\b/g)', r'state', 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]])
Return a list of the words in the string, using sep as the delimiter string. If maxsplit is given, at most maxsplit splits are done, the rightmost ones.

  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  "

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