13

如果我有一个字符串

'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']

有人可以帮忙吗?

4

3 回答 3

18

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

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

代码:

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

代码:

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']
于 2013-08-19T11:18:42.427 回答
1

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

于 2014-05-08T20:00:09.420 回答
0

好吧,问题似乎并不简单。我认为,获得健壮(但不幸的是,不是那么短)解决方案的一个好方法是使用Python Lex-Yacc来创建一个全权重的标记器。Lex-Yacc 是一种常见的(不仅仅是 Python)实践,因此可以有现成的语法来创建一个简单的算术标记器(比如这个),你只需要让它们适合你的特定需求。

于 2013-08-19T11:44:02.207 回答