我的地址格式如下:
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
正则表达式?
答案 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)
让我试试:
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 "
通用修复程序使用条带和正则表达式,如我的代码所示。始终在输入数据质量之前考虑,一些代码在经过单元测试后会失败。