正则表达式中的贪婪可选字符

And*_*unt 7 regex

我有两个问题。

  1. 如何让可选角色变得贪婪?我正在尝试编写自定义解析器,并希望函数参数位于括号中。例如sin x成为sin(x)cosh^2 x成为cosh^2(x)。我的正则表达式:

    input = 'sinh x'
    output=re.sub(r'(sin|cos|tan|cot|sec|csc)(h?)\s*(|\^\s*[\(]?\s*\-?\s*\d+\s*[\)]?\s*)?([a-z0-9]+)',r'\1\2\3(\4)', input)
    
    Run Code Online (Sandbox Code Playgroud)

    这很好用。但是当我输入sinh(x) (已经格式良好的表达式)时,它输出sin(h)(x). 如果 \4 中没有匹配项,我需要使 (h?) 贪婪或失败。怎么做?请注意,我不能写([a-gi-z0-9]),因为它sinh(h)是有效的。

  2. (h?)和之间有什么区别吗([h]?)

Bar*_*mar 2

  1. 可选字符已经是贪婪的(您可以使用??它来使其非贪婪)。但贪婪只是意味着它将尝试找到仍然允许正则表达式的其余部分匹配的最长匹配。如果有必要,它仍然会回溯。如果您想在后面有某些内容时强制失败,一种方法是使用否定的lookahead。我发布此内容是为了了解上述解释的价值。这是一个使用它的正则表达式:

    (sin|cos|tan|cot|sec|csc)(?!.\([^)]*\))(h?)\s*(|\^\s*[\(]?\s*\-?\s*\d+\s*[\)]?\s*)?([a-z0-9]+)
    
    Run Code Online (Sandbox Code Playgroud)

演示版

  1. 包含单个字符的字符类与直接将该字符放入 RE 中是相同的。它后面的量词和它周围的捕获组没有任何区别。有时单字符类可作为转义的替代方法,例如[*]?可能比 更容易阅读\*?