You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用RE库拆分字符串:保留标点及非字母数字字符实现编译器扫描器

解决编译器扫描器的Token拆分问题

你的核心需求是拆分出代码中的所有关键Token,同时保留运算符、分隔符这些符号,之前的正则只匹配了单词类字符,所以漏掉了那些符号。下面是具体的实现方案:

核心思路

我们需要用正则表达式按优先级匹配不同类型的Token:

  1. 先匹配多字符运算符(比如:=),避免被拆成单个字符;
  2. 再匹配单词类Token(关键字如INT、标识符如x);
  3. 最后匹配单字符的运算符/分隔符(;、+、*、(、)等)。

实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:48