Скрипт Python для соответствия фактическому началу строки, игнорируя вкладки и пробелы

Я думаю, что мой вопрос в значительной степени говорит сам за себя, но все же я бы опубликовал пример для большей ясности.

У меня есть следующий полностью рабочий скрипт для комментирования/раскомментирования строк в файле Javascript, открытом в редакторе 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)

Теперь я хочу поставить //~ перед фактическим началом строки (не пробелами или табуляциями, а когда действительно начинается строка, то есть символы и строки).

Если я сделаю это с модулем регулярного выражения, как показано ниже, то он дважды добавит //~, что означает как начало строки, так и фактическое начало строки.

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

Как я могу сделать это с/без Regex в python?


person Vicky Dev    schedule 28.06.2016    source источник
comment
Чтобы удалить их, просто используйте line.lstrip(), в RE запустите его с r'^\s*'   -  person cdarke    schedule 28.06.2016
comment
Проверьте это: --- regex101.com/r/hU4vO7/4   -  person Shekhar Khairnar    schedule 28.06.2016
comment
@ShekharKhairnar Это не соответствует ни одной из строк с отступом   -  person Natecat    schedule 28.06.2016


Ответы (1)


Для этого вы можете использовать замены регулярных выражений. Например, эта строка кода должна делать то, что вы хотите

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

Это регулярное выражение соответствует 0 или более пробелам [(\s*)], а затем соответствует остальной части строки [(\S.*)]. Затем он заменяет это первой группой захвата [\1], пробелами, затем двумя косыми чертами [//~], затем остальной частью строки [\2].

person Natecat    schedule 28.06.2016
comment
Это не работает в моем вышеупомянутом скрипте Python, даже после того, как я добавил import re в свой скрипт. - person Vicky Dev; 28.06.2016
comment
>>> line = ' if "//~" in line:' >>> re.sub(r"(\s*)(\S.*)", r"\1//~\2", line) ' //~if "//~" in line:' Мне подходит - person Natecat; 28.06.2016
comment
Хорошо, теперь это работает, но добавляет //~ два раза. Один в начале строки, а другой в фактическом начале строки. - person Vicky Dev; 28.06.2016
comment
Каково фактическое начало линии - person Natecat; 28.06.2016
comment
Я предлагаю вам лучше прочитать мой вопрос, я упомянул, что actual start of line - это строка без табуляции/пробелов в начальной точке, что означает, где начинается фактический символ. Также я обновил свой вопрос последним кодом, который я пробовал, и печатает дубликат //~. - person Vicky Dev; 28.06.2016
comment
Давайте продолжим это обсуждение в чате. - person Natecat; 28.06.2016
comment
Извините, сайт чата заблокирован в моем офисе, можем ли мы пока продолжить здесь, а затем удалить ненужные комментарии? - person Vicky Dev; 28.06.2016
comment
удалить `строка = //~ + строка` - person Natecat; 28.06.2016
comment
Большое спасибо, все работает, отлично, не нужно менять условие if block, верно? - person Vicky Dev; 28.06.2016
comment
Пожалуйста, обновите свой ответ, а также добавьте небольшое объяснение и разбивку по регулярному выражению, которое вы использовали. Я отмечу, что он принят тогда. - person Vicky Dev; 28.06.2016