【问题标题】:python string tokenization - custom lexer?python字符串标记化 - 自定义词法分析器?
【发布时间】:2017-11-21 15:41:56
【问题描述】:

我有一个类似的字符串:

<number>xx<->a<T>b<F>c<F>d<F>e<F>f<F>g<T>h<F>i<F>

我怎样才能有效地解析这个字符串,以便即

  • xx 的值为 null
  • a 的值为 1
  • b 的值为 0

【问题讨论】:

  • 这些值从何而来?
  • 来自 SQL RDBMS,其中这是注释字段的一部分... :(
  • 解析意味着分析。您似乎想更改/替换值。那是对的吗? 是指那个字符串还是 number 是一个数字?
  • 表示12345:1.23455 类型的数字。实际上,Analyze 可能是一种更好的表述方式。在 and 中(因为单个数据库行有多个这些记录)我想对数组进行聚合并求和,即所有 as。
  • 你能举一个你期望的输出的例子吗?还有你是如何计算的。即使阅读其他 cmets,我认为您想要什么也有点不清楚。

标签: python string tokenize lexer


【解决方案1】:

您可以使用正则表达式对其进行解析。我们首先删除字符串开头的初始&lt;word&gt;(如果存在),然后查找word&lt;word&gt; 对,将它们保存到字典中的键、值对中,使用codes 字典转换_FT,到null01

import re

s = '<number>xx<->a<T>b<F>c<F>d<F>e<F>f<F>g<T>h<F>i<F>'

m = re.match(r'<(\w*?)>', s)
if m:
    head = m.group(1)
    s = s[m.end():]
    print(head)
else:
    print('No head group')

codes = {'-': 'null', 'F': '0', 'T': '1'}
pat = re.compile(r'(\w*?)<([-\w]*?)>')

out = {k: codes[v] for k, v in pat.findall(s)}
print(out)

输出

number
{'xx': 'null', 'a': '1', 'b': '0', 'c': '0', 'd': '0', 'e': '0', 'f': '0', 'g': '1', 'h': '0', 'i': '0'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多