1

我有一个包含城市或城市加标点符号然后是邮政编码的变量。我正在使用语句来删除标点符号(和其他杂散)字符。它看起来像这样:

for c in "!@#%&*()[]{}/?<>,.":
    jobLocationCleaned = string.replace(jobLocationUnclean, c, "")
jobLocation = jobLocationCleaned

# Add to list
params.append(jobLocation)
print(jobLocation)

但是,当使用调试时,我可以看到代码逐步执行并完成它应该完成的工作,当涉及到print语句时,它会在清理之前打印地址,即for循环没有效果。

为什么是这样?

4

3 回答 3

9

在循环中,您永远不会使用先前迭代的结果,而是使用原始字符串。这是你问题的根源。

于 2013-06-14T18:47:10.070 回答
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, ""). 这是直接在对象上而不是从字符串模块调用字符串函数的推荐方法。

于 2013-06-14T18:49:33.153 回答
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'

为什么你的代码失败了?

在您的代码中,您正在遍历这些标点符号并分配jobLocationUncleanto的替换值jobLocationCleaned,但请注意字符串在 python 中是不可变的,因此replace(jobLocationUnclean, c, "") 操作根本不会更改原始值jobLocationUnclean。因此,在每次迭代中,您都会替换给定的标点符号并将新字符串分配给jobLocationCleaned. 对字符串的任何操作总是返回一个新字符串。

>>> strs = "foo"
>>> strs.replace('f','i')
'ioo'
>>> strs  #original foo is still un-changed
'foo'

所以最后你的代码实际上只替换.了 string( jobLocationUnclean) 中的字符并将其分配给jobLocationCleaned.

于 2013-06-14T18:47:18.277 回答