Python正则表达式分词:如何让re.findall返回独立词法单元分组
解决正则表达式拆分词法单元的需求
你现在的问题在于原来的正则是硬匹配整个表达式的固定结构,只能返回一组包含所有元素的元组,但你需要的是逐个匹配独立的词法单元,每个单元对应自己的标记组。
这里有个更灵活的方案,我们可以定义一个能匹配单个词法单元的正则,把数字、标识符(变量名)、运算符/赋值符分成三个独立的捕获组,这样每个匹配结果都会对应一个三元组,只有匹配到的类型所在的组有值,其余为空:
import re # 正则定义:三个可选组,分别匹配数字、标识符、运算符/赋值符 token_pattern = r'(\d+)|(\w+)|([=+*])' tokens = re.findall(token_pattern, 'res=3+x_sum*11') print(tokens)
运行这段代码后,输出正好是你期望的格式:
[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'), ('', 'x_sum', ''), ('', '', '*'), ('11', '', '')]
简单解释下这个方案:
(\d+):匹配数字,结果放在第一个组(\w+):匹配变量名这类标识符(支持下划线,符合你示例里的x_sum),结果放在第二个组([=+*]):匹配赋值符和算术运算符,结果放在第三个组- 正则里的
|表示“或”,re.findall会遍历整个字符串,每次匹配到其中一种类型,就生成一个对应的三元组,没匹配到的组自动填充空字符串
如果之后需要支持更多运算符(比如减号-、除号/),只需要在第三个组的字符集里添加即可,比如改成[=+*/-],扩展性比原来的固定结构正则强很多。
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

