2010-12-10 3 views
2

그래서 일부 파일의 모든 코드가있는 변수가 하나 있습니다. 이 파일에서 모든 주석을 제거해야합니다. 내 정규 표현식 라인 중 하나는 내가 일을 할이 모든 멀티 라인 주석을 제거하는 것입니다 원하는 것은이파이썬에서 reg exps에 작은 문제가 발생했습니다.

x=re.sub('\/\*.*\*\/','',x,re.M,re.S);

입니다. 이상한 이유로, * /의 두 인스턴스를 건너 뛰고 * /의 세 번째 인스턴스까지 모든 것을 제거합니다.

나는이 세 번째 인스턴스가 * /이라는 코드를 가지고 있고, 처음 두 개는 그 자체에있는 반면, 그 이유는 확실합니다. 왜이 문제가 중요할지 모르겠지만, 그 이유는 확실합니다.

아이디어가 있으십니까?

+1

너무 많은 이스케이프가 없도록 원시 문자열 (문자열 앞에 r을 붙이십시오)을 사용해보십시오. – Falmarri

답변

4

.*은 가능한 한 많은 문자와 일치합니다. 시도하십시오 (.*?) - 대부분의 구현은 가능한 한 적은 수의 문자를 일치 시키려고 시도해야합니다 (괄호없이 작동하지만 현재는 확실하지 않음). 따라서 전체 패턴은 다음과 같아야합니다. \/\*.*?\*\/ 또는 \/\*(.*?)\*\/

+0

아, 그랬어. 감사! – john

+0

예, 괄호없이 작동합니다. – jwueller

1

.*은 가능한 한 많은 문자를 일치 시키려고 시도합니다. 대신 (.*?)을 사용하면 가능한 한 빨리 일치하는 문자를 중지합니다.

1

정규 표현식이 "greedy"이며 여러 개의 정지 점이있는 경우 가장 멀리있는 점을 사용합니다. 정규식은이를 제어하는 ​​데 도움이되는 몇 가지 패턴이있다 특히

(? &있다! ...)

이 패턴의 일치 덧붙일되지 않은 경우에만 다음 식을 일치

찰스. (위의 & gt에 대한 뾰족한 중괄호를 넣어 - 나는 내 대답에 점점 대한 포럼 대회를 모르겠다).

(? * ...)은 Python 2.4가 아니지만 이후 버전을 사용하는 경우 좋은 선택입니다.

+0

나는 당신이'(?

관련 문제