2013-06-14 5 views
1

도시 나 도시에 구두점을 추가 한 다음 우편 번호를 포함하는 변수가 있습니다. 문장 부호를 사용하여 구두점 (및 다른 길잃은 문자)을 제거하고 있습니다. 그것은 다음과 같습니다 : 디버그를 사용하는 경우왜이 for 루프는 효과가 없습니까? (Python)

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

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

을 그러나, 나는 통해 코드 단계를 확인하고 그것이하도록되어 일을 할 수 있습니다 아직 그것을 청소하기 전에이 주소를 인쇄 print 문, 즉 올 때 for 루프는 효과가 없습니다.

왜 이런가요?

+6

제목이 잘못 되었기 때문에 – Maroun

+1

'jobLocationUnclean'의 값은 무엇입니까? – OnesimusUnbound

+2

주의 :'string.replace (variable, ..'그냥'variable.replace (...')를해라. – cmd

답변

4

각 반복에서 jobLocationUnclean에 대한 대체를 수행 중이지만 그 결과는 jobLocationClean입니다. 각 반복마다 동일한 부정한 시작점을 사용하기 때문에 마지막 반복 만 결과에 영향을 미칩니다. 이 불필요하기 때문에 나는 또한 다른 두 약간의 수정을했다

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

params.append(jobLocation) 
print(jobLocation) 

참고, 난 그냥 jobLocation을 사용하고 jobLocationClean 제거있어, 대신 string.replace(jobLocation, c, "")의 나는 jobLocation.replace(c, "")를 사용 : 다음에 코드를 변경해보십시오. 문자열 모듈을 사용하는 대신 객체에서 문자열 함수를 직접 호출하는 것이 좋습니다.

9

루프에서는 이전 반복 결과를 사용하지 않고 원래 문자열을 대신 사용합니다. 이것이 문제의 근원입니다.

>>> jobLocationUnclean = 'Abc*@ddf%sad#' 
>>> for c in "[email protected]#%&*()[]{}/?<>,.": 
     #re-assign the new string to the `jobLocationUnclean` 
     jobLocationUnclean = jobLocationUnclean.replace(c, "") 
>>> jobLocationUnclean 
'Abcddfsad' 

왜 코드가 실패 : 코드를 수정

>>> import re 
>>> from string import punctuation as punc 
>>> strs = "Abc*@ddf%^sad#" 
>>> re.sub(r'[{}]'.format(punc),'',strs) 
'Abcddfsad' 

:

0

이에 대한 regex를 사용해야합니까? 코드에서

당신은 비록 replace(jobLocationUnclean, c, "") 작업이 전혀 원래 jobLocationUnclean을 변경하지 않도록 문자열을 파이썬에서 불변 있습니다, 그 구두점 통해 반복하고 jobLocationCleanedjobLocationUnclean의 대체 값을 할당한다. 따라서 각 반복에서 주어진 구두점을 바꾸고 새 문자열을 jobLocationCleaned에 할당하십시오. 문자열에 대한 연산은 항상 새 문자열을 반환합니다.

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

그래서 결국 코드는 실제로 문자열 ( jobLocationUnclean)에 단지 . 문자를 대체하고 jobLocationCleaned에 할당.

관련 문제