2016-06-13 4 views
1

변수가 여러 줄로되어 있고 test v1.0upside으로 바꾸려고하는데 문제는 전체 행만 바꾸려고하는 것입니다. 그것이 내가 re.sub를 사용하여 대체 할 수있는 패턴으로 '\^test v1.0\$'을 퍼팅 시도 처음 test v1.0.1파이썬 - 문자열 변수에서 정규 표현식 부분 문자열 찾기 및 바꾸기

pkgLogExtract = dedent(""" 
         test v1.0.1 
         nothing 

         test v1.0 
         out 
         in 
         flip 
         """) 

print (re.sub(r'\^test v1.0\$', "upside", pkgLogExtract, 1)) 

를 대체하지해야하지만 아무것도를 대체하지 않도록 패턴과 일치합니다. 또한 원시 플래그를 사용하여 시도 했으므로 r'\^test v1.0\$'하지만 아무것도 대체하지 않습니다. 내가 뭘 할 수 있을지 아무 생각 없어?

+2

'\ ^'는 리터럴 '^'과 일치합니다. 같은 것은'$'에 관한 것입니다. 'flags = re.M'을're.sub'에 건네주고'^'와'$'에서 백 슬래시를 제거해야합니다. 그리고'.'를 피하십시오. http://ideone.com/ijPIra –

+0

을 참조하십시오.'your_string.replace ("test v1.0 \ n", "위쪽")'너무 부서지기 쉽습니다? – jDo

+0

@jDo 나는 모든 상황에서'replace'가 작동 할 것이므로 100 % 확신 할 수 없으므로 정규 표현식을 선택했습니다 (위의 스크립트는 단지 의사 코드입니다). – TheGirrafish

답변

3

\^^과 일치합니다. 약 $에 대해서도 마찬가지입니다. flags=re.Mre.sub에 전달하고 ^$에서 백 슬래시를 제거하여 줄의 시작과 끝과 각각 일치시킬 수 있어야합니다. .에서 탈출하십시오.

import re 
pkgLogExtract = """ 
test v1.0.1 
nothing 
test v1.0 
out 
in 
flip 
""" 

print (re.sub(r'^test v1\.0$', "ngn", pkgLogExtract, 1, flags=re.M)) 

참고 :

IDEONE demo를 참조하십시오 난 당신이 하나의 교체 1 스탠드 (첫 번째 경기가 교체 얻을 것이다) 알고 생각합니다.

참고 2 : flags=을 생략하고 re.M를 사용하지만, 많은 사람들이 위의를 사용하는 것을 잊지 수는 count 인수를 언급, 그래서 여기에 인수 이름을 유지하는 것이 가장 좋습니다.

+0

고마워요! 백 슬래시도없이 시도했지만 작동하지 않습니다. 문제는 전 re.M 플래그가 빠져 있다는 것입니다. – TheGirrafish

+1

가능합니다. 또한 도트는 'test v1-0'과 같은 텍스트가 아닌 문자 그대로의 점과 일치하도록 이스케이프해야합니다. –