Python: строка, которая не начинается с #

У меня есть файл, который содержит что-то вроде

# комментарий
# комментарий
не комментарий

# комментарий
# комментарий
не комментарий

Я пытаюсь прочитать файл строки за строкой и только фиксировать строки, которые не начинаются с #. Что не так с моим кодом / регулярным выражением?

import re def read_file(): pattern = re.compile("^(?<!# ).*") with open('list') as f: for line in f: print pattern.findall(line) 

Исходный код захватывает все, а не ожидал.

4 Solutions collect form web for “Python: строка, которая не начинается с #”

Альтернативный и вместе с тем простой подход состоит в том, чтобы проверить, не содержит ли первый char каждой прочитанной строки не символ # :

 def read_file(): with open('list') as f: for line in f: if not line.lstrip().startswith('#'): print line 

Iron Fist показывает, как вы, вероятно, должны это сделать; однако, если вы хотите знать, что было не так с вашим регулярным выражением, это должно было быть так:

 ^[^#].* 

Объяснение:

  • ^ – совпадение начала строки.
  • [^#] – сопоставить что-то, что не # . [^...] заключается в том, как вы говорите, что ничего не подходите (просто замените ... любыми символами, которые вы не хотите сопоставлять. Например, [^ABC123] будет соответствовать символу, который не является ни одним из A, B, C , 1, 2 или 3. Не допускайте, чтобы ^ , указывающий начало строки / строки, вас путают. Эти два ^ абсолютно не связаны.
  • .* – сопоставить ноль или больше всего остального.

РЕДАКТИРОВАТЬ:

Причина ^(?<!# ).* НЕ различает # comment а not a comment , что (?<!#) Проверяет текст перед текущей позицией. Механизм ищет # перед первым символом после начала строки, и поскольку перед началом строки нет # , любая строка соответствует .* Subpattern. Чтобы действительно проверить, есть ли первый символ # , вам просто нужно использовать ^#.* Regex. Или, если могут быть ведущие пробелы, ^\s*# .

Потому как:

(?!# ) Отрицательный Lookahead – утверждать, что невозможно совместить регулярное выражение ниже
(?<!# ) Negative Lookbehind – утверждать, что невозможно совместить регулярное выражение # .
который из regex101

Это означает, что за ним стоит только # . Итак, я имею в виду:

 >>> re.search('foo(?!bar)', 'foobar') >>> re.search('foo(?<!bar)', 'foobar') # doesn't work <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> re.search('(?<!bar)foo', 'barfoo') >>> re.search('(?!bar)foo', 'barfoo') # doesn't work <_sre.SRE_Match object; span=(3, 6), match='foo'> 

Это потому, что вы использовали неправильный токен. Поэтому ответ очень прост:

Используйте (?!bar) если вам не нужна строка после bar .
Используйте (?<!bar) если вам не нужна строка перед bar .

В этом случае используйте функцию соответствия, так как она будет проверяться в начале.

Таким образом, выражение будет \s*[^#] – для удобства я использую \s для пропуска белых пробелов.

Код OP будет –

 def read_file(): pattern = re.compile("\s*[^#]") with open(r"C:\test.txt") as f: for line in f: if pattern.match(line): print line read_file() 

РЕДАКТИРОВАТЬ-

Немного объясните, почему шаблон OP не работает –

Когда вы используете . это означает все, кроме символа прерывания строки . Поэтому, когда вы пишете ^(?<!# ).* Это означает, что any символ (кроме строки break-include включает в себя # damn it!), Который не имеет # раньше – в конечном итоге он становится любой строкой (кроме варианта разрыва строки) начинается с any символа ,

См. LIVE DEMO

Решение:

Попробуйте negation как ^(?<!# )[^#]

  • Цифры или предел числа с точным совпадением в Python Regex
  • TypeError: ожидаемая строка или буфер
  • Проблема с регулярным выражением Python
  • Элегантный способ использовать регулярное выражение для соответствия произвольно-равнодушным группам персонажей, ограничивая время появления данного символа?
  • Регулярное выражение, которое находит и заменяет символы не-ascii с помощью Python
  • Найти и заменить подстроку Regex в Python
  • регулярные выражения python возвращают true / false
  • Как найти кратчайшее совпадающее совпадение с использованием регулярных выражений?
  •  
    Interesting Posts for Van-Lav

    Использование модуля запросов Python для отправки формы без имени ввода

    Django + apache & mod_wsgi: необходимо перезапустить apache после изменений

    Как Python реализовал встроенную функцию pow ()?

    Рекурсия Infinte при расширении шаблона приложения change_form администратора

    Как я могу реализовать многопроцессорную многопользовательскую парадигму в Gevent?

    Чрезмерное взаимопревращение между многомерным и линейным индексированием

    Фильтрация по счету отношения в SQLAlchemy

    Несколько профилей пользователей в django-userena

    Как я могу использовать Tornado и Redis асинхронно?

    Получите норму строк с малым числом строк

    Пересечение набора Python быстрее, чем пересечение Rust HashSet

    python virtualenv и установка фляг. Нет модуля под названием колба

    Функции трассировки, вызываемые в строках Python

    Что такое хорошая стратегия группировки похожих слов?

    Пример ctypes обертывает «MessageBoxA» пример не работал в python33

    Python - лучший язык программирования в мире.