2016-06-28 68 views
0

我認爲我的問題非常明瞭,但我仍然會發佈一個更清晰的示例。Python腳本匹配忽略標籤和空格的行的實際開始

我有以下完整的工作腳本來評論/取消註釋在Gedit編輯器中打開的Javascript文件中的行。

#! /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) 

現在我想把//~符合實際開始前(不空格或製表符,但是當真正行開始即字符和字符串)。

如果我這樣做與正則表達式模塊一樣,然後它將兩次添加//~,這意味着線開始和實際開始線。

#! /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) 

我該如何在Python中使用/不使用正則表達式?

+0

刪除它們只需使用'line.lstrip()',在RE中用'r'^ \ s *''開始它 – cdarke

+0

檢查:--- https://regex101.com/r/hU4vO7/ 4 –

+0

@ShekharKhairnar這與任何縮進行不匹配 – Natecat

回答

0

您可以使用正則表達式替換來執行此操作。例如,這行代碼應該做你想要什麼

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

此正則表達式匹配0或多個空格字符[(\ S *),則該字符串的其他部分相匹配[(\ S. *)] 。然後它將其替換爲第一個捕獲組[1],空格,然後是兩個斜槓[//〜],然後是字符串[\ 2]的其餘部分。

+0

這在我上面提到的python腳本中不起作用,即使在向腳本中添加'import re'後也是如此。 –

+0

>>> line ='if「//〜」in line:' >>> re.sub(r「(\ s *)(\ S. *)」,r「\ 1 //〜\ 2 「,line) '//〜if」//〜「in line:'' 適用於我 – Natecat

+0

您可以發佈您的更新代碼嗎? – Natecat

相關問題