python - 使用递归评估字符串

标签 python

我正在尝试创建一个返回 True 的函数,如果传入的字符串是 '1'(有效)或 '1*'(有效)或在'(' + valid + '|' + valid + ')' 的形式(有效)。最后一部分的意思是例如:

(1|1) <- 因为它的形式是 '(' + valid + '|' + valid + ')'' 1' 有效。 ((1|1)|1) <- 因为它的形式是 '(' + valid + '|' + valid + ')' (1|1) 是有效的,'1'也是如此

((1|(1|1))|1) <- 因为它的形式是 '(' + valid + '|' + valid + ')'(1|(1|1)) 是有效的,'1'

也是有效的

我的计划:

  • 1.) 如果传入的字符串是'1',返回True(Base Case)
  • 2.) 如果传入的字符串是'1'+'*',则返回True
  • 3.) 否则,如果传入的字符串以“(”开头并以“)”结尾 查看括号内的内容并找到'|'象征 那不在另一个括号内。一旦找到再次运行该功能 在找到的符号左侧的字符串上,并再次运行该函数 在找到的符号右侧的字符串上。如果两者都为真则字符串 为真(递归步骤)
  • 4.) 如果传入任何其他内容,则返回 False。

我的代码基于我的计划:

def check(s):
    if s == '1':
        return True
    elif s == '1'+'*':
        return True
    else:
        if s.startswith('(') and s.endswith(')'):
            #TO-DO
            pass
    return False 

一些例子:

check('((1|1)|1)')
True
check('((1|1*)|1)')
True
check('(1|1)')
True
check('1')
True
check('1*')
True
check('((1|(1|1))|1)')
True
check('((1|(1|1))|((1|(1|1))|1))')
True
check('*1')
False
check('2')
False
check('((1|(1|1));1)')
False

我在这上面花了 3 天,但仍然无法弄清楚如何执行递归步骤,所以我希望有人能帮助我解决这个问题。我不知道如何找到不在另一组括号内的 '*' 符号。我想如果我能找到那个 '*' 符号,我就可以自己完成剩下的事情。

我确信我们可以使用 re 模块来做到这一点,但让我们假装我们不能使用它。

最佳答案

为了解析像这样的小语法,我建议您手动将它们简化到可以应用非回溯的程度 recursive descent parser .你给出的语法是:

valid ::= "1*" | "1" | "(" valid "|" valid ")"

所以它已经是非左递归的并且可以使用了,你只需要更喜欢 1* 而不是 1。我建议您的解析器函数具有 string -> (bool, string) 类型,其中 bool 指示解析是否成功,第二个组件是未解析的其余部分字符串。除了 bool,您还可以返回已解析字符串的内部表示 (AST)。

例如,这里是valid 产生式的解析器:

def valid(s):
    if s.startswith('1*'):
        return True, s[2:]
    if s.startswith('1'):
        return True, s[1:]
    if s.startswith('('):
        success, rest = valid(s[1:])
        if not success or not rest.startswith('|'): return False, s
        success, rest = valid(rest[1:])
        if not success or not rest.startswith(')'): return False, s
        return True, rest[1:]
    return False, s

def check(s):
    return valid(s) == (True, '')

关于python - 使用递归评估字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439736/

相关文章:

python - 未找到 unicode 数据

python - 在 Pandas DataFrame 中查找和计算字符串值

python - 使用变量将选项传递给 Tkinter 小部件

python - 如何使用 Python 删除/去除我的 csv 文件中的白色/空白行?

python - 将复数的 Pandas 数据框导出到excel

python - 如何在带有嵌入层的keras中构建序列到序列自动编码器?

python - 使用python事件并与c++交互

Python 列表与 C 数组 : 100x slower?

python - 将本地包安装到 PyCharm

Python模块问题