python - 正则表达式 匹配相等数量的两个字符

标签 python regex first-order-logic

我想使用正则表达式将任何函数的参数作为字符串进行匹配。作为示例,我们假设以下字符串:

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/

相关文章:

python - functools.partialmethod 和 classmethod 的组合

python - 使用 setuptools 构建 sphinx 文档时如何将警告变成错误?

regex - Scala & Play : route regex without identifier

first-order-logic - 这个一阶逻辑语句的解释?

python - 如何测试 transcrypt 中的未定义

python - 在 Lambda python 查询 DynamoDb 中不返回任何数据

javascript - 与 [\S\s]* 匹配?与 (.)+ 正则表达式比较

regex - 通过在 Swift 中使用正则表达式进行匹配来获取所有可能的范围

first-order-logic - 命题逻辑与一阶逻辑的区别

types - coq Set 或 Type 如何成为命题