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

时间:2013-08-19 11:15:35

标签: python token tokenize equation shlex

如果我有一个字符串

'x+13.5*10x-4e1'

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

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']

目前我正在使用shlex模块:

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

但是这会回来:

['x', '+', '13', '.', '5', '*', '10x', '-', '4e1']

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

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

'-4e1'

会变成

['-', '4e1']

'-4x1'

会变成

['-', '4', 'x', '1']

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:15)

使用正则表达式模块的split()函数,以

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

<强> CODE:

import re

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

<强>输出:

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']

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

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

<强> CODE:

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

<强>输出:

['x', '+', '13.5', '*', '10', 'x', '-', '4', 'e', '1']

答案 1 :(得分:1)

此处未建议的另一种方法是使用nltk.tokenize模块

答案 2 :(得分:0)

嗯,问题似乎并不那么简单。我认为,获得健壮(但不幸的是,不是那么短)解决方案的一个好方法是使用Python Lex-Yacc来创建一个完整权重的标记化器。 Lex-Yacc是一种常见的(不仅是Python)练习,因此可以存在用于创建简单算术标记器(like this one)的现成语法,并且您只需根据您的特定需求进行调整。