提取嵌套方括号内的sting及其pre/postfix Python

2024-05-16 03:41:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图提取嵌套方括号中的字符串并生成它们。在

假设我有下面的字符串

string = "(A((B|C)D|E|F))"

根据Extract string inside nested brackets中的答案

我可以提取嵌套方括号内的字符串,但对于我的情况,它是不同的,因为我在括号的末尾有"D",所以这是代码的结果。它看起来离我想要的输出还很远

^{pr2}$

这是我想要的输出

[[['A'],['B|C'],['D']], [['A'],['E|F']']]     # '|' means OR

你有什么建议吗,我应该用正则表达式实现还是只运行所有给定的字符串?在

这样就可以得出我的最终结果,也就是说

"ABD"
"ACD"
"AE"
"AF"

在这一点上,我将使用itertools.product


Tags: or字符串答案代码string情况extractmeans
2条回答

我建议立即找到一个以最终结果为目标的解决方案。因此,一个函数可以进行这种转换:

input: "(A((B|C)D|E|F))"
output: ['ABD', 'ACD', 'AE', 'AF']

以下是我建议的准则:

^{pr2}$

看到它运行在repl.it

您没有精确地指定语言,但看起来允许任意嵌套方括号。它不是一种普通语言。我不建议用正则表达式来解析它(这可能是因为python中的正则表达式不是真正的正则表达式,但是即使有可能,也可能是一团糟)。在

我建议为您的语言定义一个上下文无关的语法,然后解析它。你可以这样做:

EXPR -> A EXPR (an expression is an expression preceded by an alphabetic character)
EXPR -> (LIST) EXPR (an expression is a list followed by an expression)
EXPR -> "" (an expression can be an empty string)

LIST -> EXPR | LIST (a list is an expression followed by "|" followed by a list)
LIST -> EXPR (or just one expression)

这种语法可以由一个简单的自顶向下的递归解析器来解析,它在线性时间内工作。下面是一个示例实现:

^{pr2}$

{如果你不熟悉这个技巧的话。在

这个实现不是最有效的实现(例如,它显式地使用列表而不是迭代器),但它是一个很好的起点。在

相关问题 更多 >