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

时间:2018-05-03 12:51:57

标签: 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')]

但是我希望re.findall返回一个lexemes及其标记的列表,以便每个lexeme都在它自己的组中。该输出应如下所示:

[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'),

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

如何让re.findall返回类似

的输出

1 个答案:

答案 0 :(得分:1)

您可以使用

对字符串进行标记
re.findall(r'(\d+)|([^\W\d]+)|(\W)', s)

请参阅regex demo。请注意,一旦模式包含多个捕获组,re.findall将返回元组列表。上面的模式包含3个捕获组,因此,每个元组包含3个元素:1个以上的数字,1个以上的字母/下划线或非字的字符。

更多详情

  • (\d+) - 捕获第1组:1+位数
  • | - 或
  • ([^\W\d]+) - 捕获第2组:除非字和数字字符(字母或下划线)以外的1 +字符
  • | - 或
  • (\W) - 捕获第3组:非字char。

请参阅Python demo

import re
rx = r"(\d+)|([^\W\d]+)|(\W)"
s = "res=3+x_sum*11"
print(re.findall(rx, s))
# => [('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'), ('', 'x_sum', ''), ('', '', '*'), ('11', '', '')]