Отрицательный взгляд назад в регулярных выражениях Python - PullRequest
2 голосов
/ 20 октября 2010

Я пытаюсь проанализировать список данных из файла, используя python - однако я не хочу извлекать закомментированные данные. Пример структурирования данных:

#commented out block
uncommented block
#   commented block

Я пытаюсь получить только средний элемент, поэтому пытаюсь исключить элементы с хэшами в начале. Проблема в том, что некоторые хэши находятся непосредственно рядом с прокомментированными элементами, а некоторые нет, и выражение, которое у меня есть в настоящее время, работает, только если элементы прокомментированы в первом примере выше -

(?<!#)(commented)

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

Заранее спасибо,

Dan

Ответы [ 3 ]

6 голосов
/ 20 октября 2010

Зачем использовать регулярные выражения? Строковые методы вполне подойдут:

>>> s = """#commented out block
uncommented block
#   commented block
""".splitlines()
>>> for line in s:
    not line.lstrip().startswith('#')


False
True
False
4 голосов
/ 20 октября 2010

Как указывало SilentGhost, регулярное выражение - не лучшее решение этой проблемы, но я подумал, что должен рассмотреть отрицательный взгляд позади.

Вы думали сделать это:

(?<!#\s+)(commented)

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

(?<!#)(\s+commented)

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

0 голосов
/ 20 октября 2010
>>> s = """#commented out block
... uncommented block
...    #   commented block
... """
>>> for i in s.splitlines():
...    if not i.lstrip().startswith("#"):
...       print i
...
uncommented block
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...