регулярное выражение не совпадает с строкой документации, если закомментировано - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу соответствовать this (включая пробелы) из:

def foo():
    """
    this
    """

    pass

но в этом случае я не хочу ничего сопоставлять:

# def foo():
#    """
#    this
#    """
#  
#    pass

На данный момент я использую """(.*?)""" с флагом DOTALL, чтобы поймать первый пример, но, очевидно, это не мешает сопоставлению второй части. Это регулярное выражение не работает, потому что оно предотвращает любые совпадения после первого вхождения #: ^(?!#)"""(.*?)"""

1 Ответ

0 голосов
/ 07 ноября 2018

Используйте общий обходной путь: подберите то, что вам не нужно, сопоставьте и запишите то, что вам нужно:

(?sm)^#[^\r\n]*|"""(.*?)"""

См. Демоверсию regex . Собирайте только значения группы 1.

Детали

  • (?sm) - re.MULTILINE и re.DOTALL флаги
  • ^ - начало строки
  • # - # char
  • [^\r\n]* - остаток строки (0+ символов, кроме CR и LF)
  • | - или
  • """ - """ строка
  • (.*?) - Группа 1: ноль или более символов как можно меньше
  • """ - """ строка

Пример кода Python 3 :

import re
rx = r'^#[^\r\n]*|"""(.*?)"""'
s = "def foo():\n    \"\"\"\n    this\n    here\n    \"\"\"\n\n    pass\n\n\n# def foo():\n#    \"\"\"\n#    this\n#    here\n#    \"\"\"\n#  \n#    pass"
res = re.findall(rx, s, re.DOTALL|re.MULTILINE)
print(list(filter(None, res)))
# => ['\n    this\n    here\n    ']
...