使用匹配括号解析,正则表达式?

时间:2017-05-14 14:33:43

标签: python parsing

使用Python,我需要解析具有以下结构的文件:

((Lorem) ipsum dolor sit amet)
(consectetur adipiscing elit.)(Etiam
suscipit
pulvinar congue.)
((Vivamus) eu faucibus enim.)

结果必须是括号内所有内容的列表,即

[
    '(Lorem) ipsum dolor sit amet',
    'consectetur adipiscing elit.',
    'Etiam\nsuscipit\npulvinar congue.',
    '(Vivamus) eu faucibus enim.'
]

由于括号可以嵌套,也许正则表达式不是我正在寻找的工具。

任何提示?

3 个答案:

答案 0 :(得分:3)

您可以使用递归正则表达式执行此操作:

\(((?:[^()]|(?R))*)\)

这几乎完全(除了添加的捕获组),recursive patterns on regular-expressions.info

的真实示例

Test it on regex101.com。它完全返回您的示例输出。

要实现递归正则表达式,请查看此问题的答案:How can a recursive regexp be implemented in python?

答案 1 :(得分:0)

我想我会自己编码。我远离蟒蛇专家,所以也许我的解决方案不是正常的python方式。最初将计数器设置为0.然后通过char逐步执行字符串char。如果当前字符等于'('将计数器增加1。如果它等于')'减少它。如果您的计数器在减少后为0,则您有下一个列表条目。如果您的计数器低于零,则表示您有错误。就像下一个列表条目不是以'开头一样('。但这取决于你想要的东西。这应该很容易实现。

答案 2 :(得分:0)

您需要的只是一个堆栈来实现这一点。 的 ALGO

  1. 开始解析字符串,将所有内容(关闭括号除外)推送到堆栈。
  2. 如你所见,你将推动一个结束括号从堆栈开始弹出元素,直到你得到一个开始括号。因此,从关闭括号到开始括号,这将是您的列表中的元素。这样做,直到你解析完整的字符串。
  3. 或者你可以反过来(从开头解析字符串并推送除开放括号以外的所有内容)

    如需参考,请查看此帖子interactivepython.org/runestone/static/pythonds/BasicaDS/InfixPrefixandPostfixExpressions.html

    Postfix前缀方法通常用于评估表达式。