7

我正在使用 python 正则表达式模块,re.

我需要在这两个短语上匹配 '(' ')' 内的任何内容,但“不要那么贪婪”。像这样:

show the (name) of the (person)

calc the sqrt of (+ (* (2 4) 3))

结果应该从短语 1 返回:

name
person

结果应该从短语 2 返回:

+ (* (2 4) 3)

问题是,为了适应第一句话,我用'\(.*?\)'

这,在第二个短语,正好适合+ (* (2 4)

并使用'\(.*\)'正确地适合第二个短语,在第一个短语上适合(name) of the (person)

什么正则表达式对这两个短语都有效?

4

4 回答 4

7

Pyparsing可以很容易地为这样的东西编写简单的一次性解析器:

>>> text = """show the (name) of the (person)
...
... calc the sqrt of (+ (* (2 4) 3))"""
>>> import pyparsing
>>> for match in pyparsing.nestedExpr('(',')').searchString(text):
...   print match[0]
...
['name']
['person']
['+', ['*', ['2', '4'], '3']]

请注意,嵌套括号已被丢弃,嵌套文本作为嵌套结构返回。

如果您想要每个括号位的原始文本,请使用 originalTextFor 修饰符:

>>> for match in pyparsing.originalTextFor(pyparsing.nestedExpr('(',')')).searchString(text):
...   print match[0]
...
(name)
(person)
(+ (* (2 4) 3))
于 2011-05-20T12:58:42.217 回答
0

你正在尝试做的看起来像一个调车场(实际上它看起来像 LISP,所以也许你应该检查一下PyLisp)。无需使用正则表达式来解析这些类型的表达式。

请参阅分流场文章@wikipedia 和它的 Python实现

于 2011-05-20T12:38:57.650 回答
0

这匹配所有必需的信息:

(?:\()(.*?\){2})|(?:\()(.*?)(?:\))

第 1 组 = + (* (2 4) 3)

  • 最后一个 ")" 可以用 .strip(')') 去掉

第 2 组 =姓名人员

于 2011-05-20T14:50:25.177 回答
-3

只要括号不嵌套,您就可以使用惰性正则表达式:

\(.*?\)

虽然理论上您可以在正则表达式中解析有限数量的嵌套,但这非常困难且不值得付出努力。使用自定义 python 函数更容易做到这一点。请参阅此答案以获得很好的解释。

于 2011-05-20T12:26:15.530 回答