我有一个格式如下的地址:
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 作为分隔符字符串。如果给出最大拆分,则在 大多数最大拆分都已完成,最右边的拆分。
- 您不能将变量"state"直接放入替换字符串中。您应该使用 python 字符串格式来引用变量。
- 保持正则表达式简单,假设数据很简单。如果 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 "
通用修复是使用条带和正则表达式,如我的代码所示。始终提前考虑输入数据质量,某些代码在经过单元测试后会失败。