如何将字符串拆分为标记?

Mar*_*ord 10 python equation token tokenize shlex

如果我有一个字符串

'x+13.5*10x-4e1'
Run Code Online (Sandbox Code Playgroud)

如何将其拆分为以下令牌列表?

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']
Run Code Online (Sandbox Code Playgroud)

目前我正在使用shlex模块:

str = 'x+13.5*10x-4e1'
lexer = shlex.shlex(str)
tokenList = []
for token in lexer:
    tokenList.append(str(token))
return tokenList
Run Code Online (Sandbox Code Playgroud)

但这回归:

['x', '+', '13', '.', '5', '*', '10x', '-', '4e1']
Run Code Online (Sandbox Code Playgroud)

所以我试图从数字中分割字母.我正在考虑使用包含字母和数字的字符串然后以某种方式拆分它们,但不确定如何执行此操作或如何将它们全部添加回列表中以及之后的其他字符串.令牌保持有序是很重要的,我不能拥有嵌套列表.

在理想的世界中,e和E不会以相同的方式被识别为字母,因此

'-4e1'
Run Code Online (Sandbox Code Playgroud)

会成为

['-', '4e1']
Run Code Online (Sandbox Code Playgroud)

'-4x1'
Run Code Online (Sandbox Code Playgroud)

会成为

['-', '4', 'x', '1']
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Pet*_*aro 15

使用正则表达式模块的split()功能,拆分为

  • '\d+' - 数字(数字字符)和
  • '\W+' - 非单词字符:

码:

import re

print([i for i in re.split(r'(\d+|\W+)', 'x+13.5*10x-4e1') if i])
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']
Run Code Online (Sandbox Code Playgroud)

如果您不想将点(作为表达式中的浮点数)分开,那么您应该使用:

  • [\d.]+ - 数字或点字符(虽然这可以让你写: 13.5.5

码:

print([i for i in re.split(r'([\d.]+|\W+)', 'x+13.5*10x-4e1') if i])
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

['x', '+', '13.5', '*', '10', 'x', '-', '4', 'e', '1']
Run Code Online (Sandbox Code Playgroud)