我有两个问题。
如何让可选角色变得贪婪?我正在尝试编写自定义解析器,并希望函数参数位于括号中。例如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)是有效的。
(h?)和之间有什么区别吗([h]?)?
可选字符已经是贪婪的(您可以使用??它来使其非贪婪)。但贪婪只是意味着它将尝试找到仍然允许正则表达式的其余部分匹配的最长匹配。如果有必要,它仍然会回溯。如果您想在后面有某些内容时强制失败,一种方法是使用否定的lookahead。我发布此内容是为了了解上述解释的价值。这是一个使用它的正则表达式:
(sin|cos|tan|cot|sec|csc)(?!.\([^)]*\))(h?)\s*(|\^\s*[\(]?\s*\-?\s*\d+\s*[\)]?\s*)?([a-z0-9]+)
Run Code Online (Sandbox Code Playgroud)[*]?可能比 更容易阅读\*?。| 归档时间: |
|
| 查看次数: |
5889 次 |
| 最近记录: |