我想使用正则表达式将任何函数的参数作为字符串进行匹配。作为示例,我们假设以下字符串:
predicate(foo(x.bar, predicate(foo(...), bar)), bar)
这可能是较长序列的一部分
predicate(foo(x.bar, predicate(foo(...), bar)), bar)predicate(foo(x.bar, predicate(foo(...), bar)), bar)predicate(foo(x.bar, predicate(foo(...), bar)), bar)
我现在想找到表示函数/谓词及其参数的所有子字符串(即在第一个示例中整个字符串以及嵌套的 predicate(foo(...), bar)
)。问题是我不能像这样简单地匹配
predicate\(.*, bar\)
因为如果*
,我可能会匹配比谓词的参数更多的内容。如果是贪婪的,或者如果是懒惰的,则更少。这是因为这样的 predicates() 可以嵌套。
我需要一个正则表达式来查找字符串 predicate(...)
哪里...
匹配任何包含等量 (
的字符串的和)
的(懒惰)。
如果重要的话:我在 python 中使用正则表达式和 re 模块。
最佳答案
添加 PyPI package regex ,正如 @Tim Pietzcker 建议的那样,您可以使用 recursive regexes .
>>> import regex
>>> s = 'predicate(foo(x.bar, predicate(foo(...), bar)), bar)'
>>> pattern = regex.compile(r'(\w+)(?=\(((?:\w+\((?2)\)|[^()])*)\))')
>>> pattern.findall(s)
[('predicate', 'foo(x.bar, predicate(foo(...), bar)), bar'),
('foo', 'x.bar, predicate(foo(...), bar)'),
('predicate', 'foo(...), bar'),
('foo', '...')]
您还可以限制它只查找“谓词”:
>>> pattern = regex.compile(r'(predicate)(?=\(((?:\w+\((?2)\)|[^()])*)\))')
>>> pattern.findall(s)
[('predicate', 'foo(x.bar, predicate(foo(...), bar)), bar'),
('predicate', 'foo(...), bar')]
关于python - 正则表达式 匹配相等数量的两个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39704916/