【问题标题】:How can I split a string into tokens?如何将字符串拆分为标记?
【发布时间】:2013-08-21 04:04:48
【问题描述】:

如果我有一个字符串

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

有人可以帮忙吗?

【问题讨论】:

  • 负数呢?
  • 确实,shlex 模块不是这里的最佳选择;它是一个 shell 语法词法分析器和解析器,而不是数学表达式解析器。
  • @alecxe:- 在这里被视为一元运算符,导致为负数。
  • 出于好奇,为什么既是显式的* 又是隐式的乘法(10x 真的是10*x)?这使得解析也变得更加困难。

标签: python token tokenize equation shlex


【解决方案1】:

这里没有建议的另一种选择是使用nltk.tokenize 模块

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用正则表达式模块的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']
      

      【讨论】:

      • 现在13.5 也被撕成单独的部分;这可以通过一些精炼来完成。 :-P
      • @MartijnPieters 但这正是 OP 想要的!
      • 我怀疑 OP missed 实际上浮点数也被拆分了。
      • 我一直在寻找它,但从长远来看,它实际上更容易粘在一起。作为编程新手,我只是从 shlex 中获取我所拥有的东西并使用另一个函数将小数重新组合在一起。所以虽然这需要改变,但它最终会变得更简单。谢谢!
      猜你喜欢
      • 2013-09-15
      • 1970-01-01
      • 2011-01-06
      • 2011-04-22
      • 1970-01-01
      • 2021-03-30
      • 2020-11-13
      • 2012-03-23
      相关资源
      最近更新 更多