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

时间:2016-03-04 12:19:07

标签: python regex string-parsing

我的地址格式如下:

street address, town zip

我需要在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 个答案:

答案 0 :(得分: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]])
  返回中的单词列表   string,使用sep作为分隔符字符串。如果给出maxsplit,at   大多数maxsplit分裂完成,最右边的分裂。

答案 1 :(得分:1)

  1. 您不能将变量“state”直接放入替换字符串中。您应该使用python字符串格式来引用该变量。
  2. 保持正则表达式简单,假设数据很简单。如果ZIP总是出现在字符串的末尾,那么只需从末尾匹配,使用$。
  3. 让我试试:

    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  "
    

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