python: захватить строку документации как точное совпадение, используя регулярное выражение - PullRequest
0 голосов
/ 02 декабря 2018

Скажем, у меня есть следующая функция

def func(self, arg1=None, arg2=None):
    """
    Returns the product for the specified arg1 and arg2.
    Args:
        arg1: argument 1
        arg2: argument 2
    Returns:
        product of arg1 for arg2.

    DAL Owner: Team IT
    Data Owner: Team A
    """
    return arg1*arg2

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

def func.*?\):.*?\"\"\"(.*)\"\"\"

Но это не позволяет мне легко заменять строки в python.Поэтому мне нужно захватить строку документации как матч, а не группу.Я попробовал lookbehind (?<=def f2), но затем столкнулся с переменной длиной, которая не разрешена в задаче lookbehind.Любые идеи о том, как это сделать, будут высоко оценены.

ОБНОВЛЕНИЕ :

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

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Если вы хотите сопоставить только часть внутри """ s, один из вариантов - использовать модуль regex, который поддерживает токен \K, который эффективно забывает все, что было ранее сопоставлено.Используйте это, сопоставляя (обычно) def func до """ s, затем используйте \K, чтобы сбросить начальную точку совпадения в текущую позицию, затем лениво повторяйте любой символ, пока заглядывание не совпадет с другим """:

import regex
input  = '''
def func(self, arg1=None, arg2=None):
    """
    Returns the product for the specified arg1 and arg2.
    Args:
        arg1: argument 1
        arg2: argument 2
    Returns:
        product of arg1 for arg2.

    DAL Owner: Team IT
    Data Owner: Team A
    """
    return arg1*arg2
'''
replaced = regex.sub(r'(?s)def func\(.*?"""\K.*?(?=""")', 'replacement', input)
print(replaced)

Вывод:

def func(self, arg1=None, arg2=None):
    """replacement"""
    return arg1*arg2

\K, если доступно, может быть более гибкой заменой для вида назад.

0 голосов
/ 02 декабря 2018

Если вы просто хотите легко заменить, вы собираете все остальное в группы:

(def func.*?\):.*?\"\"\").*(\"\"\")

Затем, чтобы заменить, вы просто пишете $1xxx$2 в качестве замены, с xxx фактическая замена, которую вы хотите.

Попробуйте здесь .

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