2014-10-18 1 views
0

re.sub을 사용하여 문자열의 일부를 대체하고 싶습니다. 정확히 어떻게 생겼는지 알고 있습니다. 코드의 관련 부분 : 내 테스트 경우정규식 검색을 포함하여 변수 문자열을 대체하고 대체합니다.

print "Regex statement: ", foundStatements[iterator] 
print "string to replace with : \n", latexPreparedString 
print "string to search&replace in: \n", fileAsString 
processedString = re.sub(foundStatements[iterator], latexPreparedString, fileAsString) 
print "processed string: \n", processedString 

foundStatements[iterator]"%@import script_example.py (*out =(.|\n)*?return out)"입니다 그러나 processedStringfoundStatements[iterator]를 포함하더라도, processedString이는 re.sub 작업을 수행하지 않도록 정확하게 fileAsString 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

EDIT : 좋아, 내가 확실히 정규식 코드를 포함하고 대체하고 싶은 문자열과 관련이있다. 그냥 그것을 해석하는 원시 문자열로 foundStatements[iterator] 해석하는 방법이 있나요? 내가 생각할 수있는 유일한 해결책은 정규식 기호를 \ regexsymbol (예 : * -> \ *) 문자열로 대체하는 함수를 만드는 것이지만 inbuilt 함수로이를 해결하는 방법이 있다는 것을 이해할 수 있습니다 ./

EDIT2 : 음, 단지 re.sub(re.escape(foundStatements[iterator]), latexPreparedString, fileAsString)로 변경가 보인다 나는 그것이 꽤있다있는 모든 단일 정규 표현식 기호로 작동하는지 확인해야 할 것 때문에 그것은 또한 약간의 과잉을 것 작업. regex 문이 원본 파일의 내용과 충돌하지 않는 경우는 예외입니다. 설명하기 위해 latexPreparedStringfoundStatements[iterator]의 정규식 부분을 사용하여 생성됩니다. 정규 표현식이 아무 것도 치지 않을 때 latexPreparedString을 설정할 수 없어야한다는 것은 논리적이지만, 기본적으로 latexPreparedString = "을 설정합니다.이 경우 re.sub은 공백 문자열로 바꾸어야합니다. 아무것도 히트 여기에 코드 순간에 보이는 방법은 다음과 같습니다. 문자열에 정확히 일치를 교체하기위한, pastebin.com/wUedK3LN

답변

0

먼저 [string.replace()][1] 사용해야합니다

processedString = fileAsString(foundStatements[iterator], latexPreparedString) 

그러나,이 여전히 귀하의 경우에 실패합니다, foundStatements[iterator]에 줄 바꿈 문자가 있기 때문에이 문자를 이스케이프 처리하려면 the r prefix을 사용해야합니다.를 선언 할 때. 당신은 여전히 ​​ re.sub를 사용하려면

, 당신은 r로 문자열을 접두사 및 re.escape(foundStatements[iterator]) 대신 foundStatements[iterator]을 사용하는 모두 있습니다. re.escapehere에 대한 자세한 내용을 볼 수 있습니다.

+0

foundStatements는 re.findall을 통해 선언되므로 원시 문자열을 만드는 방법을 모르겠습니다. 나는 문제 해결을 위해 해결책을 찾지 못했지만 문제를 해결하는 방법에 대한 답변을 원합니다. 현재 솔루션에서는 모든 히트를 두 번 반복합니다. 한번은 모든 정보를 빼내고, 두 번째는 모든 정보를 대체합니다. 지금까지 내 코드가 이해하기 어려운 경우에는 다음과 같습니다. [link] (http://pastebin.com/Q10gqcXj). 당신이 찾고있는 솔루션을 어디에 삽입하려고하는지 주석 처리 된 것을 볼 수 있습니다. – user2875994

+0

문자열이 다른 함수 (예 :'re.findall')에서 생성 될 때, 어떤 리터럴도 이미 이스케이프됩니다; 문자열을 명시 적으로 정의 할 때 'r'만 있으면됩니다. 당신은 여전히're.escape'을 사용할 필요가 있습니다. – Arithmomaniac

관련 문제