一种匹配包含括号的 Lisp 字符的方法

Posted

技术标签:

【中文标题】一种匹配包含括号的 Lisp 字符的方法【英文标题】:A way to match Lisp characters containing a parenthesis 【发布时间】:2021-02-21 17:23:34 【问题描述】:

我正在用 Python 编写一个 Lisp 解析器,作为编译器项目的一部分。我的标记器的工作原理是这样的:

def tokenize(filename):
    with open(filename, "r") as file:
        comment_free = remove_comments(file.read())
    return comment_free.replace("(", " ( ").replace(")", " ) ").split()

Lisp 字符有点不同:字符 a 将是 #\a( 将是 #\(,等等。对于包含左括号或右括号的字符,它们被分词器错误地分成两个单独的部分(#\())。

我可以将字符指示符与[^#\] 匹配,将括号与\(|\) 匹配,但是我将如何创建一个模式来检查代码的一部分是否不以字符指示符开头并后跟左括号或右括号?如果我可以制作这样的模式,我可以用括号替换所有这样的实例,括号周围有空格。我认为([^#\\])(\(|\))* 可以工作,但并非在所有情况下都有效。有没有精通正则表达式的人知道如何解决这个问题?

【问题讨论】:

【参考方案1】:

我将如何创建一个模式来检查代码的一部分是否存在 不以字符指示符开头,后跟左或右 括号?

您可以使用否定的lookbehind 来检查指示器是否不在左侧,并使用字符类而不是交替匹配()

(?<!#\\)[()]

说明

(?&lt;!#\\) 负向后看,断言左边的不是#\ [()] 匹配 ()

Regex demo


如果指标是#\\,您可以使用2 个字符类:

(?<![#\\])[()]

Regex demo

【讨论】:

以上是关于一种匹配包含括号的 Lisp 字符的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配括号中的内容,不包含括号

1354括弧匹配检验

python的re模块介绍

计蒜客 括号匹配

2括弧匹配检验

括号匹配问题 -算法专题