用于简单表达式的Python正则表达式标记器

用于简单表达式的Python正则表达式标记器,python,regex,python-3.x,Python,Regex,Python 3.x,我写了这个正则表达式,它将表达式'res=3+x_sum*11'拆分为词素 import re print(re.findall('(\w+)(=)(\d+)(\*|\+)(\w+)(\*|\+)(\d+)', 'res=3+x_sum*11')) 我的输出如下所示: [('res', '=', '3', '+', 'x_sum', '*', '11')] [('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'), ('',

我写了这个正则表达式,它将表达式'res=3+x_sum*11'拆分为词素

import re
print(re.findall('(\w+)(=)(\d+)(\*|\+)(\w+)(\*|\+)(\d+)', 'res=3+x_sum*11'))
我的输出如下所示:

[('res', '=', '3', '+', 'x_sum', '*', '11')]
[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'),

('', 'x_sum', ''), ('', '', '*'), ('11', '', '')] 
但我希望re.findall返回词素及其标记的列表,以便每个词素都在自己的组中。该输出应如下所示:

[('res', '=', '3', '+', 'x_sum', '*', '11')]
[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'),

('', 'x_sum', ''), ('', '', '*'), ('11', '', '')] 

如何让re.findall返回这样的输出

您可以使用

re.findall(r'(\d+)|([^\W\d]+)|(\W)', s)
看。请注意,
re.findall
在模式包含多个捕获组后返回元组列表。上面的模式包含3个捕获组,因此,每个元组包含3个元素:1+数字、1+字母/下划线或非单词字符

更多详细信息

  • (\d+)
    -捕获组1:1+个数字
  • |
    -或
  • ([^\W\d]+)
    -捕获组2:1+字符,非单词和数字字符(字母或下划线)除外
  • |
    -或
  • (\W)
    -捕获组3:非单词字符
见: