Python使用RE库拆分字符串:保留标点及非字母数字字符实现编译器扫描器
解决编译器扫描器的Token拆分问题
你的核心需求是拆分出代码中的所有关键Token,同时保留运算符、分隔符这些符号,之前的正则只匹配了单词类字符,所以漏掉了那些符号。下面是具体的实现方案:
核心思路
我们需要用正则表达式按优先级匹配不同类型的Token:
- 先匹配多字符运算符(比如
:=),避免被拆成单个字符; - 再匹配单词类Token(关键字如
INT、标识符如x); - 最后匹配单字符的运算符/分隔符(
;、+、*、(、)等)。
实现代码
import re # 你的测试代码内容 code_content = 'INT x; READ x; x := (x+1)*x; WRITE x' # 关键正则表达式 tokens = re.findall(r':=|\w+|[;+\-*/()=]', code_content) print(tokens)
正则表达式解析
让我们拆解这个正则的各个部分:
:=:优先匹配双字符的赋值运算符,确保它被识别为一个完整Token,而不是拆成:和=;\w+:匹配由字母、数字、下划线组成的连续字符,对应代码中的关键字(INT、READ)和标识符(x);[;+\-*/()=]:匹配所有需要保留的单字符符号,这里包含了分号、加减乘除运算符、括号和等号(如果后续需要支持其他符号,直接添加到这个字符类里即可)。
运行结果
执行代码后,输出正好是你期望的结果:
['INT', 'x', ';', 'READ', 'x', ';', 'x', ':=', '(', 'x', '+', '1', ')', '*', 'x', ';', 'WRITE', 'x']
注意事项
- 正则的匹配顺序很重要:多字符Token一定要放在单字符Token前面,否则会被拆分(比如如果把
:放在:=前面,:=会被拆成:和=); - 如果后续需要支持更多多字符运算符(比如
>=、!=),直接在正则最前面添加即可,比如r':=|>=|!=|\w+|[;+\-*/()=]'; - 这个正则会自动忽略空格(因为我们没有匹配空格的规则),正好符合扫描器忽略空白符的需求。
内容的提问来源于stack exchange,提问作者MNS
相关产品推荐
相关产品推荐

