我写了这个正则表达式,将表达式分解为“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返回类似
的输出答案 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', '', '')]