我有一个包含城市,城市和标点符号的变量,然后是邮政编码。我正在使用语句删除标点符号(和其他流浪)字符。它看起来像这样:
for c in "!@#%&*()[]{}/?<>,.":
jobLocationCleaned = string.replace(jobLocationUnclean, c, "")
jobLocation = jobLocationCleaned
# Add to list
params.append(jobLocation)
print(jobLocation)
然而,当使用Debug时,我可以看到代码一步一步完成它应该在print
语句时它应该在清理之前打印地址的工作,即{{1} } loop没有效果。
为什么会这样?
答案 0 :(得分:9)
在循环中,您永远不会使用上一次迭代的结果而是使用原始字符串。这是你问题的根源。
答案 1 :(得分:4)
在每次迭代中,您正在jobLocationUnclean
进行替换,但将结果分配给jobLocationClean
。由于您在每次迭代时使用相同的不干净起点,因此只有最后一次迭代才会对结果产生任何影响。尝试将代码更改为以下内容:
jobLocation = jobLocationUnclean
for c in "!@#%&*()[]{}/?<>,.":
jobLocation = jobLocation.replace(c, "")
params.append(jobLocation)
print(jobLocation)
请注意,我还做了两个小修改,我只使用jobLocation
并删除了jobLocationClean
,因为它是不必要的,而不是string.replace(jobLocation, c, "")
我使用了jobLocation.replace(c, "")
。这是直接在对象上而不是从字符串模块调用字符串函数的推荐方法。
答案 2 :(得分:0)
您应该使用regex
:
>>> import re
>>> from string import punctuation as punc
>>> strs = "Abc*@ddf%^sad#"
>>> re.sub(r'[{}]'.format(punc),'',strs)
'Abcddfsad'
修复代码:
>>> jobLocationUnclean = 'Abc*@ddf%sad#'
>>> for c in "!@#%&*()[]{}/?<>,.":
#re-assign the new string to the `jobLocationUnclean`
jobLocationUnclean = jobLocationUnclean.replace(c, "")
>>> jobLocationUnclean
'Abcddfsad'
为什么你的代码失败了?
在你的代码中,你循环遍历这些标点并指定一个
将jobLocationUnclean
的值替换为jobLocationCleaned
,但请注意
字符串在python中是不可变的,因此replace(jobLocationUnclean, c, "")
操作根本不会更改原始jobLocationUnclean
。因此,在每次迭代中,您将替换给定的标点符号并将新字符串分配给jobLocationCleaned
。
对字符串的任何操作总是返回一个新字符串。
>>> strs = "foo"
>>> strs.replace('f','i')
'ioo'
>>> strs #original foo is still un-changed
'foo'
因此,最后您的代码实际上只替换了字符串.
)中的jobLocationUnclean
字符,并将其分配给jobLocationCleaned
。