Удалить «#» комментарии из строки (комментарий может начинаться с промежуточной строки строки) - PullRequest
0 голосов
/ 27 марта 2019

Я в основном работаю, чтобы удалить комментарии из файла (читать) и записать его в какой-нибудь файл. Комментарии в одну строку могут находиться в начале строки или между ними. Часть, с которой начинается комментарий, до следующей строки, должна быть удалена.

В некоторых ответах предлагается приведенный ниже код, но он не работает для однострочных комментариев, которые присутствуют после некоторого полезного кода. У меня есть некоторые знания о lex, поэтому я попытался изменить код, чтобы исправить мои потребности, но я застрял. Пожалуйста, помогите.

import re
def stripComments(code):
    code = str(code)
    return re.sub(r'(?m)^ *#.*\n?', '', code)

print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))

Ожидаемый результат:

Почему так серьезно?

bar foo

Фактическая выработка:

Почему так серьезно? # Этот комментарий не удаляется

бар фу

[перевод строки]

[перевод строки]

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

Попробуйте с этим:

import re
def stripComments(code):
    code = str(code)
    return re.sub(r'(#.*)?\n?', '', code)

print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))
# Why so Serious? bar foo
1 голос
/ 27 марта 2019

Ваше регулярное выражение имеет привязку '^', что означает, что шаблон может начинаться только в начале строки. Без этого это в значительной степени работает.

Возможно, вы также захотите скомпилировать регулярное выражение заранее, чтобы вы могли повторно использовать его, не компилируя каждый раз:

COMMENT_PATTERN = re.compile('\s*#.*\n?', re.MULTILINE)


def strip_comments(code):
    return COMMENT_PATTERN.sub('', str(code))

Я также заменил пробел ' ' на '\s', который будет совпадать с любым пробелом, таким как табуляция и т. Д. Если вам это не нравится, вы должны вернуть его обратно.

0 голосов
/ 27 марта 2019

Вы можете использовать regex101.com для отладки вашего регулярного выражения и просмотра его соответствия.

(?m) изменяет правила сопоставления так, чтобы ^ соответствовало началу строки, а не началу всей строки

^ * соответствует началу строки, за которой следует любое количество пробелов. (Так что, надеюсь, нет никаких вкладок!)

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

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

0 голосов
/ 27 марта 2019

Я думаю, что базовое исследование вашей строки может сделать работу лучше (и быстрее), чем использование re, вот рабочий пример:

def stripComments(code):
    codeWithoutComments = ""
    for i in code.splitlines():
        marker = False
        for j in i:
            if j == "#":
                marker = True
            if not marker:
                codeWithoutComments += j
        codeWithoutComments += "\n"
    return codeWithoutComments

print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))

возвращаемое значение:

"""
Why so Serious?
bar foo

"""
...