2012-02-10 3 views
1

대체 할 행 문자열이 여러 개 있지만 작동하지 않는 이유를 이해할 수 없습니다. 어떤 이유로 문자열의 마침표가 정규 표현식의 일치를 중지합니다.파이썬에서 마침표가 여러 줄의 정규 표현식을 대체합니까?

내 문자열 :

s = """ 
[some_previous_text] 
<start> 
one_period . 
<end> 
[some_text_after] 
""" 

것은 내가 끝낼 싶습니다 무엇 :

s = """ 
[some_previous_text] 
foo 
[some_text_after] 
""" 

내가 처음 시도 무엇, 그러나 아무것도 일치하지 않습니다

>>> import re 
>>> s = "<start>\none_period .\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
<start> 
one_period . 
<end> 

그러나 기간을 연장했을 때 제대로 작동했습니다.

>>> import re 
>>> s = "<start>\n<end>\none_period .\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
foo 
one_period . 
<end> 

는 그래서 여기에 무슨 : 나는 기간 전에 <end> 태그를 넣을 때
>>> import re 
>>> s = "<start>\nno_period\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
foo 

또한, 그것은 처음 <end> 태그를 일치? 왜 기간은 [^.]*과 일치합니까?

는 편집 :

내가 실수 캐럿 ^ 새로운 라인 매칭이라고 생각

를 해결했다. 내가 원했던 것은 re.DOTALL 플래그였습니다 (앰버로 표시됨). 여기에 내가 지금 사용하고 표현이다 :

>>> import re 
>>> s = "<start>\none_period .\n<end>" 
>>> print re.sub("<start>.*<end>", "foo", s, flags=re.DOTALL) 
foo 

답변

3

왜 그렇습니까? [^.]은 ".이 아닌 모든 문자 집합"이므로 마침표가 일치하지 않습니다.


은 아마 당신은 대신 [^.]* 대신 .* (모든 문자의 수)를 넣어 의미?

줄 바꿈을 통해 일치하는

, re.DOTALL 지정

re.sub("<start>.*<end>", "foo", s, flags=re.DOTALL) 
+0

'. *'을 사용하는 경우에는 're.sub (". * ", "foo", s)')와 일치하지 않습니다. 올바른 대체 표현식은 무엇입니까? – user749618

+0

줄마다'.'를 매치 시키려면're.DOTALL' 플래그를 사용해야합니다. http://docs.python.org/library/re.html#re.DOTALL – Amber

+0

're.sub (". * ", "foo", s, flags = re.DOTALL)'작품! 감사합니다. – user749618

1

그게 [^.]*는 모든 문자하지만 기간과 일치하는 부정 문자 클래스이기 때문이다.

re.S 수정 자와 함께 <start>.*?<end>과 같은 점을 사용하면 도트가 줄 바꿈 문자와 일치하게됩니다.

re.sub("<start>.*?<end>", "foo", s, flags=re.S) 
+0

이 그래서 올바른 식을 사용하는 것입니다? – user749618

+0

@ user749618 답변을 업데이트했습니다. 're.S'는 Amber가 제안한're.DOTALL'과 동일합니다. – stema

+0

're \()'는 Python 2.7 또는 Python 3.1+에서 flags 인수만을 받아 들인다. 그 전에는 플래그 세트로 정규 표현식을 컴파일하거나'[\ s \ S] *와 같은 것을 사용할 필요가있다. '. * 대신'. –

관련 문제