【问题标题】:python: capture docstring as an exact match using regexpython:使用正则表达式将文档字符串捕获为完全匹配
【发布时间】:2019-05-03 15:49:05
【问题描述】:

假设我有以下功能

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 问题中不允许的可变长度。任何有关如何解决此问题的想法都将不胜感激。

更新

我真的很想知道这是否可以通过完全匹配来完成,即不必使用多个捕获组

【问题讨论】:

    标签: python regex match


    【解决方案1】:

    如果您想匹配"""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,如果可用,可以更灵活地替代lookbehind。

    【讨论】:

      【解决方案2】:

      如果您只想轻松替换,请将其他所有内容分组:

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

      然后替换,你只需写$1xxx$2作为替换,xxx是你想要的实际替换。

      试试here

      【讨论】:

      • 我已经想到了这一点,但宁愿避免组队。原因是我的匹配项并不总是具有相同的组
      • @Fizi 您可以编辑问题以显示解决方案不适用的情况吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多