2016-06-28 1 views
0

제 질문은 제멋대로라고 생각하지만, 여전히 명확성을 위해 예제를 게시 할 것입니다.파이썬 스크립트는 탭과 공백을 무시한 라인의 실제 시작과 일치합니다.

Gedit 편집기에서 연 자바 스크립트 파일의 줄을 주석 처리하거나 주석 처리를 제거하는 데 다음과 같은 작업 스크립트가 있습니다.

#! /usr/bin/env python 
import sys 
import StringIO 
block = sys.stdin.read() 
block = StringIO.StringIO(block) 
msg = '' 
for line in block: 
    if "//~" in line: 
     line = line.replace('//~','') 
     msg = "All lines in selection uncommented" 
    else: 
     line = "//~" + line 
     msg = "All lines in selection commented" 
    sys.stdout.write(line) 
exit(msg) 

가 지금은 라인의 실제 시작의 앞에 //~을 데려 가고 싶다는 (안 공백이나 탭하지만 정말 라인 즉 문자와 문자열을 시작).

아래와 같이 regex 모듈을 사용하여이 작업을 수행하면 //~이 두 번 추가됩니다. 즉, 행의 시작과 실제 행의 시작을 의미합니다.

#! /usr/bin/env python 
import sys 
import StringIO 
import re 
block = sys.stdin.read() 
block = StringIO.StringIO(block) 
msg = '' 
for line in block: 
    if "//~" in line: 
     line = re.sub(r"(\s*)(\S.*)", r"\1//~\2", line) 
     line = line.replace('//~','') 
     msg = "All lines in selection uncommented" 
    else: 
     line = re.sub(r"(\s*)(\S.*)", r"\1//~\2", line) 
     line = "//~" + line 
     msg = "All lines in selection commented" 
    sys.stdout.write(line) 
exit(msg) 

어떻게하면 정규식을 사용할지 여부를 파이썬으로 할 수 있습니까?

+0

그들을 제거하려면'line.lstrip()'을 사용하고, RE에서는'r '^ \ s *''로 시작하십시오. – cdarke

+0

다음을 확인하십시오 : --- https://regex101.com/r/hU4vO7/ 4 –

+0

@ShekharKhairnar 들여 쓰기 된 줄과 일치하지 않습니다 – Natecat

답변

0

정규 표현식을 사용하여이를 대신 할 수 있습니다. 예를 들어, 다음 코드 행은 당신이 정규식은 0 개 이상의 공백 문자를 [(\는 * S)]과 일치

line = re.sub(r"^(\s*)(\S.*)", r"\1//~\2", line) 

하고 싶은 일을해야, 다음 문자열의 나머지 부분과 일치하는 [(\ S. *)] . 그런 다음이를 첫 번째 캡처 그룹 [\ 1], 공백, 두 슬래시 [// ~], 나머지 문자열 [\ 2]로 바꿉니다.

+0

내 스크립트에'import re'을 추가 한 후에도 위의 python 스크립트에서는 작동하지 않습니다. –

+0

>>> re "(\ s *) (\ S. *)", r "\ 1 // ~ \ 2 줄에 '10. ", line) '// ~"~ ~ "행의 경우 :' 나를 위해 작동합니다. – Natecat

+0

업데이트 된 코드를 게시 할 수 있습니까? – Natecat

관련 문제